openscad-cpp-evaluator 1.48.0__tar.gz → 1.49.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/PKG-INFO +1 -1
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/pyproject.toml +1 -1
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/topology.cpp +71 -86
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_booleans.cpp +31 -8
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/uv.lock +1 -1
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/.github/workflows/wheels.yml +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/.gitignore +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/.gitmodules +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/CLAUDE.md +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/LICENSE +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/README.md +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/bindings/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/bindings/ast_to_py.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/bindings/module.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/cmake/embed_font.cmake +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/cmake/patch_manifold.cmake +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/examples/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/examples/eval_perf_benchmark.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/examples/manifold_cache_reuse.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/examples/minimal_debugger.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/.github/workflows/ci.yml +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/.gitignore +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/CLAUDE.md +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/LICENSE +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/README.md +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/api.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/ast_node.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/comments.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/declarations.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/expression.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/module_instantiation.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/scope_builder.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast/vector_element.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/ast.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/comments.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/position.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/pretty_print.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/scope_table.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/serialization.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/include/openscad_cpp_parser/source_map.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/.DS_Store +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/api.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/ast/ast_node.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/ast/declarations.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/ast/expression.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/ast/format_utils.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/ast/module_instantiation.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/ast/scope_builder.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/ast/vector_element.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/comment_attach_internal.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/comments.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/grammar/driver.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/grammar/driver.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/grammar/lexer.l +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/grammar/lexer_api.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/grammar/oscad_location.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/grammar/parser.y +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/inline_comment_attach.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/position.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/scope.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/serialization/json_io.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/serialization/yaml_io.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/src/source_map.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_assignments.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_ast_generation.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_comments_and_files.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_concurrent_parse.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_const_borrow.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_control.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_expressions.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_functions.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_inline_comments.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_lexical.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_modules.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_node_str.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_pretty_print.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_profile_time.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_render_expression.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_scope.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_serialization.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_smoke.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_source_map.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_strict_commas.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_use_include.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tests/test_vectors.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/tools/cli/main.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/bound_args.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/bytecode.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/bytecode_compiler.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/bytecode_vm.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/call_args.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/colored_body.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/coverage.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/csg_node.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/css_colors.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/debug_hooks.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/debug_repl.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/dispatch.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/dxf_svg_import.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/eval_context.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/eval_error.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/eval_use.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/evaluator.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/export.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/font_match.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/font_provider.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/format_closure.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/freetype_font_provider.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/function_builtins.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/import_builtin.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/manifold_cache.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/mesh_check.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/mesh_import.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/osc_range.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/profile.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/scope_trail.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/segments.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/surface_load.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/text_metrics.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/utf8.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/value.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/include/openscad_cpp_evaluator/zip_stored.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/python/openscad_cpp_evaluator/__init__.py +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/resources/fonts/LICENSE +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/resources/fonts/LiberationSans-Bold.ttf +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/resources/fonts/LiberationSans-BoldItalic.ttf +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/resources/fonts/LiberationSans-Italic.ttf +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/resources/fonts/LiberationSans-Regular.ttf +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/booleans.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/builtins.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/call_args.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/color.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/control.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/dxf_dim.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/extrude.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/function_builtins.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/import.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/modifiers.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/primitives_2d.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/primitives_3d.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/profile_time.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/registry.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/roof.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/segments.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/surface.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/text.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/builtins/transforms.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/bytecode_compiler.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/bytecode_vm.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/colored_body.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/coverage.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/csg_generate.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/csg_resolve.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/css_colors.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/debug/debug_repl.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/debug_profile.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/eval_context.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/eval_error.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/eval_use.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/export.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/expr_eval.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/format_closure.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/import/dxf_import.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/import/mesh_import.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/import/scene_import.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/import/surface_load.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/import/svg_import.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/measure_geometry.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/mesh_check.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/stmt_eval.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/text/font_match.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/text/freetype_font_provider.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/text/text_metrics.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/user_calls.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/utf8.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/value.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/xkcd_colors.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/xkcd_colors.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/src/zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_bytecode_compiler.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_children_separate.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_cli.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_control_flow.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_coverage.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_csg_tree.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_debug_hooks.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_discretizer.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_dxf_svg_import.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_eval_context.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_export.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_expr_eval.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_extrude_roof.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_feature_detection.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_function_builtins.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_helpers.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_import_export.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_include_cache.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_manifold_cache.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_mesh_check.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_multi_color_merge.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_openscad_parity.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_primitives.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_profile_time.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_profiling.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_python_bindings.py +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_render_expr.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_scope_trail.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_scoping.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_surface.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_tail_calls.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_text.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_transforms.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_undef_args.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_unexpected_args.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_use.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_value.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_viewport_params.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tests/test_zip_stored.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tools/cli/CMakeLists.txt +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tools/cli/cli_lib.cpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tools/cli/cli_lib.hpp +0 -0
- {openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/tools/cli/main.cpp +0 -0
|
@@ -651,27 +651,22 @@ std::vector<ColoredBody> generateMeshRepair(Evaluator& ev, const CSGParams& para
|
|
|
651
651
|
|
|
652
652
|
// -- levelset(field, bounds, isovalue) -------------------------------------
|
|
653
653
|
//
|
|
654
|
-
// A solid from a grid of sampled values
|
|
655
|
-
//
|
|
654
|
+
// A solid from a grid of sampled values: the field array the script handed
|
|
655
|
+
// us, or a function sampled onto a grid at edge= spacing. The grid is then
|
|
656
|
+
// marched directly, as BOSL2's isosurface() does -- see marchingCubes() and
|
|
657
|
+
// the end of generateLevelSet for why Manifold::LevelSet is no longer used.
|
|
656
658
|
//
|
|
657
|
-
// Why
|
|
658
|
-
//
|
|
659
|
-
// 0.
|
|
660
|
-
//
|
|
661
|
-
// means the C++ side never re-enters the evaluator, so canParallel can be
|
|
662
|
-
// TRUE -- Manifold's docs warn that parallel policies "will crash language
|
|
663
|
-
// runtimes with runtime locks that expect to not be called back by
|
|
664
|
-
// unregistered threads", which is exactly what a callback design forfeits.
|
|
659
|
+
// Why offer an array at all, when a function is the obvious mapping:
|
|
660
|
+
// measured, building the field in OpenSCAD costs 0.41 us/sample against
|
|
661
|
+
// 0.96 us for a closure call per sample, because the arithmetic inlines into
|
|
662
|
+
// the list comprehension.
|
|
665
663
|
//
|
|
666
|
-
// The trade is memory: ~67 bytes per cell, so 200^3 is about
|
|
667
|
-
//
|
|
664
|
+
// The trade is memory: ~67 bytes per cell for the array, so 200^3 is about
|
|
665
|
+
// 550 MB and that is the practical ceiling.
|
|
668
666
|
//
|
|
669
|
-
// Accuracy is bounded by the GRID
|
|
670
|
-
//
|
|
671
|
-
//
|
|
672
|
-
// spacing resamples it through LevelSet instead, which samples a
|
|
673
|
-
// body-centred cubic lattice (sdf.cpp:440-446) that a plain cubic grid does
|
|
674
|
-
// not line up with, so the lambda interpolates trilinearly between samples.
|
|
667
|
+
// Accuracy is bounded by the GRID. An array at its own spacing (the default)
|
|
668
|
+
// is marched as is; an edge= asking for a different spacing re-samples it
|
|
669
|
+
// trilinearly onto a grid at that spacing first.
|
|
675
670
|
|
|
676
671
|
namespace {
|
|
677
672
|
|
|
@@ -1013,6 +1008,13 @@ manifold::MeshGL64 marchingCubes(const std::vector<double>& d, const size_t n[3]
|
|
|
1013
1008
|
const int axis = (b - a) == 1 ? 0 : (b - a) == 2 ? 1 : 2;
|
|
1014
1009
|
int64_t& id = edgeVert[3 * p[a] + static_cast<size_t>(axis)];
|
|
1015
1010
|
if (id < 0) {
|
|
1011
|
+
// Linear, as BOSL2 interpolates. Root-finding each
|
|
1012
|
+
// vertex onto the true surface of a function field was
|
|
1013
|
+
// tried and measured (#745 on BelfrySCAD): 16% less mean
|
|
1014
|
+
// normal error on a sphere, but where the grid is too
|
|
1015
|
+
// coarse for the field it put real ripples on vertices
|
|
1016
|
+
// the grid cannot connect -- jagged, sliver-strewn --
|
|
1017
|
+
// where interpolating smooths them away, as BOSL2 does.
|
|
1016
1018
|
const double t = v[a] / (v[a] - v[b]);
|
|
1017
1019
|
const double x = org[0] + h[0] * (static_cast<double>(i + (a & 1)) + (axis == 0 ? t : 0.0));
|
|
1018
1020
|
const double y = org[1] + h[1] * (static_cast<double>(j + (a >> 1 & 1)) + (axis == 1 ? t : 0.0));
|
|
@@ -1122,14 +1124,10 @@ std::vector<ColoredBody> generateLevelSet(Evaluator& ev, const CSGParams& params
|
|
|
1122
1124
|
const oscad::ASTNode& node) {
|
|
1123
1125
|
// Two shapes of field, and the choice matters beyond taste:
|
|
1124
1126
|
//
|
|
1125
|
-
// a GRID -- faster to sample (0.41 vs 0.96 us)
|
|
1126
|
-
//
|
|
1127
|
-
//
|
|
1128
|
-
//
|
|
1129
|
-
// the true surface, so it is MORE accurate, with no
|
|
1130
|
-
// memory ceiling. But every sample is a closure call, and
|
|
1131
|
-
// canParallel must be false or the evaluator gets called
|
|
1132
|
-
// back from threads it knows nothing about.
|
|
1127
|
+
// a GRID -- faster to sample (0.41 vs 0.96 us). Accuracy is capped
|
|
1128
|
+
// by the grid; memory is the ceiling.
|
|
1129
|
+
// a FUNCTION -- sampled onto a grid at edge= spacing, one closure call
|
|
1130
|
+
// per sample. Needs edge=, since nothing else says how fine.
|
|
1133
1131
|
const Value& fieldArg = params.at("field");
|
|
1134
1132
|
const ClosurePtr* fieldFn = std::get_if<ClosurePtr>(&fieldArg);
|
|
1135
1133
|
// The array is NOT parsed yet: whether it should be field[i][j] or
|
|
@@ -1415,13 +1413,8 @@ std::vector<ColoredBody> generateLevelSet(Evaluator& ev, const CSGParams& params
|
|
|
1415
1413
|
if (i0[a] > n[a] - 2) i0[a] = n[a] - 2;
|
|
1416
1414
|
t[a] = g[a] - static_cast<double>(i0[a]);
|
|
1417
1415
|
}
|
|
1418
|
-
//
|
|
1419
|
-
//
|
|
1420
|
-
// the padding and the clip to `bounds` below leaves a clean plane.
|
|
1421
|
-
// Answering "outside" there instead (as this once did) made Manifold
|
|
1422
|
-
// close the surface right AT the box face, along its own lattice: a
|
|
1423
|
-
// waffle-textured staircase INSIDE the bounds, which the clip could
|
|
1424
|
-
// not remove (#745 on BelfrySCAD).
|
|
1416
|
+
// Clamped, though every grid node lies inside the block: the
|
|
1417
|
+
// floating-point position of the last node can land a hair past it.
|
|
1425
1418
|
|
|
1426
1419
|
double acc = 0.0;
|
|
1427
1420
|
for (int c = 0; c < 8; ++c) {
|
|
@@ -1433,62 +1426,54 @@ std::vector<ColoredBody> generateLevelSet(Evaluator& ev, const CSGParams& params
|
|
|
1433
1426
|
return bandDistance(acc, isoLo, isoHi, invert);
|
|
1434
1427
|
};
|
|
1435
1428
|
|
|
1436
|
-
//
|
|
1437
|
-
//
|
|
1438
|
-
//
|
|
1439
|
-
//
|
|
1440
|
-
// there, and cut back to the box actually asked for. The cut is then a
|
|
1441
|
-
// clean plane.
|
|
1429
|
+
// Every 3D field is marched on a REGULAR grid whose outermost nodes lie
|
|
1430
|
+
// exactly on `bounds`, as BOSL2's isosurface() marches: an array at its
|
|
1431
|
+
// own spacing as is, anything else sampled onto one first (a function by
|
|
1432
|
+
// calling it, an array re-sampled trilinearly).
|
|
1442
1433
|
//
|
|
1443
|
-
//
|
|
1444
|
-
//
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
//
|
|
1450
|
-
// the bracket is within it (a distance along the edge, so independent of
|
|
1451
|
-
// the field's units), instead of interpolating linearly between the two
|
|
1452
|
-
// lattice samples. 1% of the edge. Measured on #745 on BelfrySCAD: the
|
|
1453
|
-
// function form's vertices go from up to 0.2 off the true surface to on
|
|
1454
|
-
// it, and the mean face-normal error on a per-axis edge halves to
|
|
1455
|
-
// BOSL2's own; a grid gains too, since the trilinear field between
|
|
1456
|
-
// samples is not linear along a lattice edge. Costs 11-20% more work.
|
|
1434
|
+
// This replaced Manifold::LevelSet for the function form and for an
|
|
1435
|
+
// array at another spacing (#745 on BelfrySCAD). LevelSet samples its own
|
|
1436
|
+
// body-centred lattice, whose irregular triangles shade as a field of
|
|
1437
|
+
// dimples even where every vertex is on the surface -- worse with a
|
|
1438
|
+
// per-axis edge, which meshed a squashed field and stretched it back. And
|
|
1439
|
+
// that lattice does not land on the box, so where the clip below cut it
|
|
1440
|
+
// the cut face did not follow the same grid as the rest of the surface.
|
|
1457
1441
|
//
|
|
1458
|
-
//
|
|
1459
|
-
//
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
for (size_t k = 0; k < field->nz; ++k)
|
|
1472
|
-
for (size_t j = 0; j < field->ny; ++j)
|
|
1473
|
-
for (size_t i = 0; i < field->nx; ++i)
|
|
1474
|
-
d[((k + 1) * n[1] + (j + 1)) * n[0] + (i + 1)] =
|
|
1475
|
-
bandDistance(field->at(i, j, k), isoLo, isoHi, invert);
|
|
1476
|
-
const std::array<double, 3> org{origin[0] - spacing[0], origin[1] - spacing[1], origin[2] - spacing[2]};
|
|
1477
|
-
solid = manifold::Manifold(marchingCubes(d, n, org, spacing));
|
|
1478
|
-
// Never expected; but a mesh Manifold refuses must not cost the
|
|
1479
|
-
// user their shape, so fall back to resampling it.
|
|
1480
|
-
if (solid.Status() != manifold::Manifold::Error::NoError) marchGrid = false;
|
|
1442
|
+
// A per-axis edge that does not divide the box is shrunk to the nearest
|
|
1443
|
+
// one that does, never grown: never coarser than the caller asked.
|
|
1444
|
+
std::array<double, 3> h = spacing;
|
|
1445
|
+
size_t cells[3];
|
|
1446
|
+
for (int a = 0; a < 3; ++a) {
|
|
1447
|
+
const double w = (*hi)[a] - origin[a];
|
|
1448
|
+
if (marchGrid) {
|
|
1449
|
+
cells[a] = static_cast<size_t>(std::llround(w / spacing[a]));
|
|
1450
|
+
} else {
|
|
1451
|
+
const double e = edgeVec ? edgeV[a] : edge;
|
|
1452
|
+
cells[a] = std::max<size_t>(1, static_cast<size_t>(std::ceil(w / e - 1e-9)));
|
|
1453
|
+
h[a] = w / static_cast<double>(cells[a]);
|
|
1454
|
+
}
|
|
1481
1455
|
}
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1456
|
+
// One "outside" node beyond the box on every side, so every surface
|
|
1457
|
+
// closes; the clip below cuts that overhang back to the box.
|
|
1458
|
+
const size_t n[3] = {cells[0] + 3, cells[1] + 3, cells[2] + 3};
|
|
1459
|
+
std::vector<double> d(n[0] * n[1] * n[2], -1.0);
|
|
1460
|
+
for (size_t k = 0; k + 2 < n[2]; ++k)
|
|
1461
|
+
for (size_t j = 0; j + 2 < n[1]; ++j)
|
|
1462
|
+
for (size_t i = 0; i + 2 < n[0]; ++i) {
|
|
1463
|
+
const double x = origin[0] + h[0] * static_cast<double>(i);
|
|
1464
|
+
const double y = origin[1] + h[1] * static_cast<double>(j);
|
|
1465
|
+
const double z = origin[2] + h[2] * static_cast<double>(k);
|
|
1466
|
+
d[((k + 1) * n[1] + (j + 1)) * n[0] + (i + 1)] =
|
|
1467
|
+
marchGrid ? bandDistance(field->at(i, j, k), isoLo, isoHi, invert)
|
|
1468
|
+
: fieldFn ? sampleFn(manifold::vec3(x, y, z))
|
|
1469
|
+
: sampleGrid(manifold::vec3(x, y, z));
|
|
1470
|
+
}
|
|
1471
|
+
const std::array<double, 3> org{origin[0] - h[0], origin[1] - h[1], origin[2] - h[2]};
|
|
1472
|
+
manifold::Manifold solid(marchingCubes(d, n, org, h));
|
|
1473
|
+
if (solid.Status() != manifold::Manifold::Error::NoError) {
|
|
1474
|
+
// Never expected: marchingCubes closes by construction.
|
|
1475
|
+
ev.warn("levelset(): could not build a closed mesh from this field", &node.position());
|
|
1476
|
+
return {};
|
|
1492
1477
|
}
|
|
1493
1478
|
|
|
1494
1479
|
if (solid.IsEmpty()) return {};
|
|
@@ -1606,13 +1606,13 @@ TEST(LevelSet, AGridFieldIsAlsoCutCleanlyAtTheBox) {
|
|
|
1606
1606
|
EXPECT_NEAR(capArea, 3.14159265358979 * r * r, 0.03 * 3.14159265358979 * r * r);
|
|
1607
1607
|
}
|
|
1608
1608
|
|
|
1609
|
-
TEST(LevelSetFn,
|
|
1610
|
-
//
|
|
1611
|
-
//
|
|
1612
|
-
//
|
|
1613
|
-
//
|
|
1614
|
-
// the
|
|
1615
|
-
// worst.
|
|
1609
|
+
TEST(LevelSetFn, VerticesInterpolateAsBOSL2Does) {
|
|
1610
|
+
// #745 on BelfrySCAD, second round: a function field is sampled onto a
|
|
1611
|
+
// regular grid and marched, as BOSL2's isosurface() does, rather than
|
|
1612
|
+
// meshed by Manifold::LevelSet, whose body-centred lattice shaded as
|
|
1613
|
+
// dimples. Vertices are interpolated linearly along grid edges, so they
|
|
1614
|
+
// are near the surface, not on it: the 1/r field at edge=2 is where that
|
|
1615
|
+
// is worst. A per-axis edge must mesh as well as a plain one.
|
|
1616
1616
|
for (const char* edge : {"2", "[1,2,0.4]"}) {
|
|
1617
1617
|
Evaluated e = evalSrc(std::string("levelset(function(x,y,z) 5 / norm([x,y,z]), "
|
|
1618
1618
|
"bounds=[[-8,-8,-8],[8,8,8]], isovalue=[1, 1/0], edge=") +
|
|
@@ -1623,7 +1623,8 @@ TEST(LevelSetFn, VerticesLieOnTheTrueSurface) {
|
|
|
1623
1623
|
for (size_t v = 0; v + 2 < m.vertProperties.size(); v += m.numProp)
|
|
1624
1624
|
worst = std::max(worst, std::abs(manifold::la::length(manifold::vec3(m.vertProperties[v], m.vertProperties[v + 1],
|
|
1625
1625
|
m.vertProperties[v + 2])) - 5.0));
|
|
1626
|
-
EXPECT_LT(worst, 0.
|
|
1626
|
+
EXPECT_LT(worst, 0.3) << edge;
|
|
1627
|
+
EXPECT_EQ(soleBody(e).Genus(), 0) << edge;
|
|
1627
1628
|
}
|
|
1628
1629
|
}
|
|
1629
1630
|
|
|
@@ -1701,6 +1702,28 @@ TEST(LevelSetGrid, AVectorEdgeWithoutBoundsSpacesEachAxis) {
|
|
|
1701
1702
|
EXPECT_NEAR(b.min.z, -0.75, 1e-9); EXPECT_NEAR(b.max.z, 0.75, 1e-9);
|
|
1702
1703
|
}
|
|
1703
1704
|
|
|
1705
|
+
TEST(LevelSetGrid, AFunctionIsMarchedOnAGridLandingOnTheBounds) {
|
|
1706
|
+
// Per-axis edge [1, 2, 0.4] over a 12 x 16 x 7 box: x and y divide it,
|
|
1707
|
+
// z does not (17.5 cells), so z is shrunk to 7/18 -- never coarsened --
|
|
1708
|
+
// and the grid's last nodes lie exactly on the box. Every vertex is then
|
|
1709
|
+
// on a grid edge.
|
|
1710
|
+
Evaluated e = evalSrc("levelset(function(x,y,z) 5 / norm([x,y,z]), isovalue=[1, 1/0], "
|
|
1711
|
+
"bounds=[[-6,-8,0],[6,8,7]], edge=[1,2,0.4]);");
|
|
1712
|
+
ASSERT_EQ(e.bodies.size(), 1u);
|
|
1713
|
+
EXPECT_GT(onGridLines(soleBody(e), manifold::vec3(-6, -8, 0), manifold::vec3(1, 2, 7.0 / 18.0)), 0.5);
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
TEST(LevelSetGrid, AnArrayAtAnotherEdgeIsResampledOntoAGridLandingOnTheBounds) {
|
|
1717
|
+
// #745 on BelfrySCAD: an array resampled at an edge= not dividing the box
|
|
1718
|
+
// cut faces that did not follow the rest of the surface, since
|
|
1719
|
+
// LevelSet's lattice did not land on the box. 40/2.7 is 14.8 cells, so
|
|
1720
|
+
// the grid is 15 cells of 40/15 and the cut faces are its own.
|
|
1721
|
+
Evaluated e = evalSrc(sphereFieldSrc(41, 20) +
|
|
1722
|
+
"levelset(f, bounds=[[-20,-20,-20],[20,20,20]], isovalue=25, edge=2.7);");
|
|
1723
|
+
ASSERT_EQ(e.bodies.size(), 1u);
|
|
1724
|
+
EXPECT_GT(onGridLines(soleBody(e), manifold::vec3(-20.0), manifold::vec3(40.0 / 15.0)), 0.5);
|
|
1725
|
+
}
|
|
1726
|
+
|
|
1704
1727
|
TEST(LevelSetGrid, A2DFieldArrayIsPlacedByEdgeToo) {
|
|
1705
1728
|
// field[i][j] says 2D without a bounds to say so.
|
|
1706
1729
|
Evaluated e = evalSrc("f = [for (i=[0:4]) [for (j=[0:2]) -1 ]];\nlevelset(f, edge=2);");
|
|
File without changes
|
{openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/.github/workflows/wheels.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/examples/eval_perf_benchmark.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/examples/manifold_cache_reuse.cpp
RENAMED
|
File without changes
|
{openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/examples/minimal_debugger.cpp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openscad_cpp_evaluator-1.48.0 → openscad_cpp_evaluator-1.49.0}/external/openscad_cpp_parser/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|