Merge remote-tracking branch 'upstream/main' into enh-spoolman-support
# Conflicts: # src/libslic3r/Preset.cpp # src/libslic3r/PresetBundle.cpp # src/libslic3r/Print.cpp # src/libslic3r/Print.hpp # src/slic3r/GUI/NotificationManager.cpp # src/slic3r/GUI/NotificationManager.hpp # src/slic3r/GUI/Plater.cpp # src/slic3r/GUI/Plater.hpp # src/slic3r/GUI/PresetComboBoxes.cpp # src/slic3r/GUI/Tab.cpp
|
|
@ -17,13 +17,6 @@
|
|||
"customizations": {
|
||||
"vscode": {
|
||||
"settings": {
|
||||
"cmake.configureArgs": [
|
||||
"-DSLIC3R_GTK=3",
|
||||
"-DBBL_RELEASE_TO_PUBLIC=1",
|
||||
"-DBBL_INTERNAL_TESTING=0",
|
||||
"-DSLIC3R_STATIC=1",
|
||||
"-DCMAKE_PREFIX_PATH=${workspaceFolder}/deps/build/destdir/usr/local"
|
||||
]
|
||||
},
|
||||
|
||||
// Add the IDs of extensions you want installed when the container is created.
|
||||
|
|
|
|||
1
.github/workflows/build_all.yml
vendored
|
|
@ -76,6 +76,7 @@ jobs:
|
|||
- /opt/ghc:/opt/ghc1
|
||||
- /usr/local/share/boost:/usr/local/share/boost1
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
variant:
|
||||
- arch: x86_64
|
||||
|
|
|
|||
3
.github/workflows/build_check_cache.yml
vendored
|
|
@ -33,8 +33,7 @@ jobs:
|
|||
- name: set outputs
|
||||
id: set_outputs
|
||||
env:
|
||||
# todo: this is mad! refactor other build scripts to use same name
|
||||
dep-folder-name: ${{ inputs.os == 'windows-latest' && '/OrcaSlicer_dep' || inputs.os == 'macos-14' && '' || inputs.os != 'macos-14' && '/destdir' || '' }}
|
||||
dep-folder-name: ${{ inputs.os != 'macos-14' && '/OrcaSlicer_dep' || '' }}
|
||||
output-cmd: ${{ inputs.os == 'windows-latest' && '$env:GITHUB_OUTPUT' || '"$GITHUB_OUTPUT"'}}
|
||||
run: |
|
||||
echo cache-key=${{ inputs.os }}-cache-orcaslicer_deps-build-${{ hashFiles('deps/**') }} >> ${{ env.output-cmd }}
|
||||
|
|
|
|||
3
.gitignore
vendored
|
|
@ -39,3 +39,6 @@ src/OrcaSlicer-doc/
|
|||
resources/profiles/user/default
|
||||
*.code-workspace
|
||||
deps_src/build/
|
||||
test.js
|
||||
/.cache/
|
||||
.clangd
|
||||
|
|
|
|||
101
CMakeLists.txt
|
|
@ -55,6 +55,11 @@ endif ()
|
|||
|
||||
project(OrcaSlicer)
|
||||
|
||||
# Backward compatibility for old CMake versions
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_VERSION VERSION_LESS "3.25")
|
||||
set(LINUX ON CACHE BOOL "" FORCE)
|
||||
endif ()
|
||||
|
||||
include("version.inc")
|
||||
include(GNUInstallDirs)
|
||||
include(CMakeDependentOption)
|
||||
|
|
@ -67,6 +72,12 @@ if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (default Release)" FORCE)
|
||||
endif()
|
||||
|
||||
if (DEFINED BBL_RELEASE_TO_PUBLIC)
|
||||
add_compile_definitions("BBL_RELEASE_TO_PUBLIC=${BBL_RELEASE_TO_PUBLIC}")
|
||||
else ()
|
||||
add_compile_definitions("BBL_RELEASE_TO_PUBLIC=$<CONFIG:Release>")
|
||||
endif ()
|
||||
|
||||
find_package(Git)
|
||||
if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
||||
if(DEFINED ENV{git_commit_hash} AND NOT "$ENV{git_commit_hash}" STREQUAL "")
|
||||
|
|
@ -93,13 +104,9 @@ if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
|||
endif()
|
||||
|
||||
if(DEFINED ENV{SLIC3R_STATIC})
|
||||
set(SLIC3R_STATIC_INITIAL $ENV{SLIC3R_STATIC})
|
||||
set(SLIC3R_STATIC_INITIAL $ENV{SLIC3R_STATIC})
|
||||
else()
|
||||
if (MSVC OR MINGW OR APPLE)
|
||||
set(SLIC3R_STATIC_INITIAL 1)
|
||||
else()
|
||||
set(SLIC3R_STATIC_INITIAL 0)
|
||||
endif()
|
||||
set(SLIC3R_STATIC_INITIAL 1)
|
||||
endif()
|
||||
|
||||
option(SLIC3R_STATIC "Compile OrcaSlicer with static libraries (Boost, TBB, glew)" ${SLIC3R_STATIC_INITIAL})
|
||||
|
|
@ -117,7 +124,7 @@ CMAKE_DEPENDENT_OPTION(SLIC3R_DESKTOP_INTEGRATION "Allow perfoming desktop integ
|
|||
|
||||
set(OPENVDB_FIND_MODULE_PATH "" CACHE PATH "Path to OpenVDB installation's find modules.")
|
||||
|
||||
set(SLIC3R_GTK "2" CACHE STRING "GTK version to use with wxWidgets on Linux")
|
||||
set(SLIC3R_GTK "3" CACHE STRING "GTK version to use with wxWidgets on Linux")
|
||||
|
||||
set(IS_CROSS_COMPILE FALSE)
|
||||
|
||||
|
|
@ -131,6 +138,10 @@ if (${COLORED_OUTPUT})
|
|||
endif ()
|
||||
|
||||
if (APPLE)
|
||||
list(LENGTH CMAKE_OSX_ARCHITECTURES _arch_len)
|
||||
if (_arch_len GREATER 1)
|
||||
message(FATAL_ERROR "OrcaSlicer only supports building for one architecture at a time. Please make sure only one architecture is specified in CMAKE_OSX_ARCHITECTURES")
|
||||
endif ()
|
||||
set(CMAKE_FIND_FRAMEWORK LAST)
|
||||
set(CMAKE_FIND_APPBUNDLE LAST)
|
||||
list(FIND CMAKE_OSX_ARCHITECTURES ${CMAKE_SYSTEM_PROCESSOR} _arch_idx)
|
||||
|
|
@ -150,6 +161,14 @@ option(SLIC3R_BUILD_SANDBOXES "Build development sandboxes" OFF)
|
|||
option(BUILD_TESTS "Build unit tests" OFF)
|
||||
option(ORCA_TOOLS "Build Orca tools" OFF)
|
||||
|
||||
if (FLATPAK)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++20")
|
||||
set(SLIC3R_PCH OFF CACHE BOOL "" FORCE)
|
||||
set(SLIC3R_FHS ON CACHE BOOL "" FORCE)
|
||||
set(BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
||||
set(SLIC3R_DESKTOP_INTEGRATION OFF CACHE BOOL "" FORCE)
|
||||
endif ()
|
||||
|
||||
if (IS_CROSS_COMPILE)
|
||||
message("Detected cross compilation setup. Tests and encoding checks will be forcedly disabled!")
|
||||
set(SLIC3R_PERL_XS OFF CACHE BOOL "" FORCE)
|
||||
|
|
@ -173,6 +192,13 @@ if(SLIC3R_DESKTOP_INTEGRATION)
|
|||
add_definitions(-DSLIC3R_DESKTOP_INTEGRATION)
|
||||
endif ()
|
||||
|
||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||
message(STATUS "Automatically setting CMAKE_INSTALL_PREFIX")
|
||||
set_property(CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_BINARY_DIR}/OrcaSlicer")
|
||||
endif()
|
||||
|
||||
message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
if (MSVC AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||
set(IS_CLANG_CL TRUE)
|
||||
|
||||
|
|
@ -218,24 +244,61 @@ if (NOT MSVC)
|
|||
add_compile_options(-fsigned-char)
|
||||
endif ()
|
||||
|
||||
# Display and check CMAKE_PREFIX_PATH
|
||||
message(STATUS "SLIC3R_STATIC: ${SLIC3R_STATIC}")
|
||||
if (NOT "${CMAKE_PREFIX_PATH}" STREQUAL "")
|
||||
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH} (from cache or command line)")
|
||||
set(PREFIX_PATH_CHECK ${CMAKE_PREFIX_PATH})
|
||||
elseif (NOT "$ENV{CMAKE_PREFIX_PATH}" STREQUAL "")
|
||||
message(STATUS "CMAKE_PREFIX_PATH: $ENV{CMAKE_PREFIX_PATH} (from environment)")
|
||||
set(PREFIX_PATH_CHECK $ENV{CMAKE_PREFIX_PATH})
|
||||
if ("${DEP_BUILD_DIR}" STREQUAL "")
|
||||
get_filename_component(BIN_DIR_NAME ${CMAKE_BINARY_DIR} NAME)
|
||||
if (APPLE AND BIN_DIR_NAME STREQUAL "${CMAKE_OSX_ARCHITECTURES}")
|
||||
file(RELATIVE_PATH BIN_DIR_NAME ${CMAKE_BINARY_DIR}/../.. ${CMAKE_BINARY_DIR})
|
||||
endif ()
|
||||
set(DEP_BUILD_DIR "${CMAKE_SOURCE_DIR}/deps/${BIN_DIR_NAME}" CACHE PATH "Path to dependencies build directory" FORCE)
|
||||
message(STATUS "DEP_BUILD_DIR: ${DEP_BUILD_DIR} (generated automatically and saved to cache)")
|
||||
set(AUTOGENERATED_DEP_BUILD_DIR ${DEP_BUILD_DIR} CACHE PATH "Provides the last autogenerated DEP_BUILD_DIR" FORCE)
|
||||
else ()
|
||||
message(STATUS "CMAKE_PREFIX_PATH: (default)")
|
||||
message(STATUS "DEP_BUILD_DIR: ${DEP_BUILD_DIR} (from cache or command line)")
|
||||
endif ()
|
||||
|
||||
if ("${CMAKE_PREFIX_PATH}" STREQUAL "" OR "${CMAKE_PREFIX_PATH}" STREQUAL "${AUTOGENERATED_PREFIX_PATH}")
|
||||
if (DEFINED AUTOGENERATED_DEP_BUILD_DIR AND NOT "${DEP_BUILD_DIR}" STREQUAL "${AUTOGENERATED_DEP_BUILD_DIR}")
|
||||
message(STATUS "CMAKE_PREFIX_PATH is being re-generated due to DEP_BUILD_DIR being manually updated")
|
||||
set(REGEN_DESTDIR TRUE)
|
||||
unset(AUTOGENERATED_DEP_BUILD_DIR CACHE)
|
||||
endif ()
|
||||
else ()
|
||||
unset(AUTOGENERATED_PREFIX_PATH CACHE)
|
||||
endif ()
|
||||
|
||||
# Display and check CMAKE_PREFIX_PATH
|
||||
if ("${CMAKE_PREFIX_PATH}" STREQUAL "" OR REGEN_DESTDIR)
|
||||
set(CMAKE_PREFIX_PATH "${DEP_BUILD_DIR}/OrcaSlicer_dep/usr/local" CACHE PATH "Path to dependencies install directory" FORCE)
|
||||
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH} (generated automatically and saved to cache)")
|
||||
set(AUTOGENERATED_PREFIX_PATH ${CMAKE_PREFIX_PATH} CACHE STRING "Provides the last autogenerated CMAKE_PREFIX_PATH" FORCE)
|
||||
unset(REGEN_DESTDIR CACHE)
|
||||
else ()
|
||||
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH} (from cache or command line)")
|
||||
endif ()
|
||||
set(PREFIX_PATH_CHECK ${CMAKE_PREFIX_PATH})
|
||||
|
||||
# the CMAKE_PREFIX_PATH environment variable is separate from the CMAKE_PREFIX_PATH cache variable and provides additional paths to search for libraries.
|
||||
if (NOT "$ENV{CMAKE_PREFIX_PATH}" STREQUAL "")
|
||||
message(STATUS "CMAKE_PREFIX_PATH: $ENV{CMAKE_PREFIX_PATH} (from environment)")
|
||||
list(APPEND PREFIX_PATH_CHECK $ENV{CMAKE_PREFIX_PATH})
|
||||
endif ()
|
||||
|
||||
# Check all directories in CMAKE_PREFIX_PATH variables
|
||||
foreach (DIR ${PREFIX_PATH_CHECK})
|
||||
if (NOT EXISTS "${DIR}")
|
||||
message(WARNING "CMAKE_PREFIX_PATH element doesn't exist: ${DIR}")
|
||||
endif ()
|
||||
endforeach ()
|
||||
|
||||
if (APPLE)
|
||||
set(CMAKE_MACOSX_RPATH ON CACHE BOOL "")
|
||||
set(CMAKE_MACOSX_BUNDLE ON CACHE BOOL "")
|
||||
endif ()
|
||||
|
||||
if (APPLE AND CMAKE_MACOSX_RPATH AND "${CMAKE_INSTALL_RPATH}" STREQUAL "")
|
||||
set(CMAKE_INSTALL_RPATH ${CMAKE_PREFIX_PATH})
|
||||
endif ()
|
||||
|
||||
# Add our own cmake module path.
|
||||
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules/)
|
||||
message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
|
||||
|
|
@ -276,7 +339,11 @@ if(WIN32)
|
|||
endif()
|
||||
else()
|
||||
# Try to use the default Windows 10 SDK path.
|
||||
set(WIN10SDK_INCLUDE_PATH "$ENV{WindowsSdkDir}/Include/$ENV{WindowsSDKVersion}")
|
||||
if (DEFINED ENV{WindowsSdkDir} AND DEFINED ENV{WindowsSDKVersion})
|
||||
set(WIN10SDK_INCLUDE_PATH "$ENV{WindowsSdkDir}/Include/$ENV{WindowsSDKVersion}")
|
||||
else ()
|
||||
set(WIN10SDK_INCLUDE_PATH "C:/Program Files (x86)/Windows Kits/10/Include/10.0.22000.0")
|
||||
endif ()
|
||||
if (NOT EXISTS "${WIN10SDK_INCLUDE_PATH}/winrt/windows.graphics.printing3d.h")
|
||||
message("${WIN10SDK_INCLUDE_PATH}/winrt/windows.graphics.printing3d.h was not found")
|
||||
message("STL fixing by the Netfabb service will not be compiled")
|
||||
|
|
|
|||
108
build_linux.sh
|
|
@ -10,10 +10,12 @@ function usage() {
|
|||
echo "Usage: ./${SCRIPT_NAME} [-1][-b][-c][-d][-h][-i][-j N][-p][-r][-s][-t][-u][-l][-L]"
|
||||
echo " -1: limit builds to one core (where possible)"
|
||||
echo " -j N: limit builds to N cores (where possible)"
|
||||
echo " -b: build in debug mode"
|
||||
echo " -b: build in Debug mode"
|
||||
echo " -c: force a clean build"
|
||||
echo " -C: enable ANSI-colored compile output (GNU/Clang only)"
|
||||
echo " -d: download and build dependencies in ./deps/ (build prerequisite)"
|
||||
echo " -D: dry run"
|
||||
echo " -e: build in RelWithDebInfo mode"
|
||||
echo " -h: prints this help text"
|
||||
echo " -i: build the Orca Slicer AppImage (optional)"
|
||||
echo " -p: boost ccache hit rate by disabling precompiled headers (default: ON)"
|
||||
|
|
@ -31,7 +33,9 @@ function usage() {
|
|||
SLIC3R_PRECOMPILED_HEADERS="ON"
|
||||
|
||||
unset name
|
||||
while getopts ":1j:bcCdhiprstulL" opt ; do
|
||||
BUILD_DIR=build
|
||||
BUILD_CONFIG=Release
|
||||
while getopts ":1j:bcCdDehiprstulL" opt ; do
|
||||
case ${opt} in
|
||||
1 )
|
||||
export CMAKE_BUILD_PARALLEL_LEVEL=1
|
||||
|
|
@ -40,7 +44,8 @@ while getopts ":1j:bcCdhiprstulL" opt ; do
|
|||
export CMAKE_BUILD_PARALLEL_LEVEL=$OPTARG
|
||||
;;
|
||||
b )
|
||||
BUILD_DEBUG="1"
|
||||
BUILD_DIR=build-dbg
|
||||
BUILD_CONFIG=Debug
|
||||
;;
|
||||
c )
|
||||
CLEAN_BUILD=1
|
||||
|
|
@ -51,6 +56,13 @@ while getopts ":1j:bcCdhiprstulL" opt ; do
|
|||
d )
|
||||
BUILD_DEPS="1"
|
||||
;;
|
||||
D )
|
||||
DRY_RUN="1"
|
||||
;;
|
||||
e )
|
||||
BUILD_DIR=build-dbginfo
|
||||
BUILD_CONFIG=RelWithDebInfo
|
||||
;;
|
||||
h ) usage
|
||||
exit 1
|
||||
;;
|
||||
|
|
@ -112,6 +124,21 @@ function check_available_memory_and_disk() {
|
|||
fi
|
||||
}
|
||||
|
||||
function print_and_run() {
|
||||
cmd=()
|
||||
# Remove empty arguments, leading and trailing spaces
|
||||
for item in "$@" ; do
|
||||
if [[ -n $item ]]; then
|
||||
cmd+=( "$(echo "${item}" | xargs)" )
|
||||
fi
|
||||
done
|
||||
|
||||
echo "${cmd[@]}"
|
||||
if [[ -z "${DRY_RUN}" ]] ; then
|
||||
"${cmd[@]}"
|
||||
fi
|
||||
}
|
||||
|
||||
# cmake 4.x compatibility workaround
|
||||
export CMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||
|
||||
|
|
@ -137,7 +164,7 @@ else
|
|||
source "./scripts/linux.d/${DISTRIBUTION}"
|
||||
fi
|
||||
|
||||
echo "FOUND_GTK3=${FOUND_GTK3}"
|
||||
echo "FOUND_GTK3_DEV=${FOUND_GTK3_DEV}"
|
||||
if [[ -z "${FOUND_GTK3_DEV}" ]] ; then
|
||||
echo "Error, you must install the dependencies before."
|
||||
echo "Use option -u with sudo"
|
||||
|
|
@ -176,51 +203,27 @@ fi
|
|||
if [[ -n "${BUILD_DEPS}" ]] ; then
|
||||
echo "Configuring dependencies..."
|
||||
read -r -a BUILD_ARGS <<< "${DEPS_EXTRA_BUILD_ARGS}"
|
||||
BUILD_ARGS+=(-DDEP_WX_GTK3=ON)
|
||||
if [[ -n "${CLEAN_BUILD}" ]]
|
||||
then
|
||||
rm -fr deps/build
|
||||
print_and_run rm -fr deps/$BUILD_DIR
|
||||
fi
|
||||
mkdir -p deps/build
|
||||
if [[ -n "${BUILD_DEBUG}" ]] ; then
|
||||
# build deps with debug and release else cmake will not find required sources
|
||||
mkdir -p deps/build/release
|
||||
set -x
|
||||
cmake -S deps -B deps/build/release "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G Ninja \
|
||||
-DSLIC3R_PCH="${SLIC3R_PRECOMPILED_HEADERS}" \
|
||||
-DDESTDIR="${SCRIPT_PATH}/deps/build/destdir" \
|
||||
-DDEP_DOWNLOAD_DIR="${SCRIPT_PATH}/deps/DL_CACHE" \
|
||||
"${COLORED_OUTPUT}" \
|
||||
"${BUILD_ARGS[@]}"
|
||||
set +x
|
||||
cmake --build deps/build/release
|
||||
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE=Debug)
|
||||
mkdir -p deps/$BUILD_DIR
|
||||
if [[ $BUILD_CONFIG != Release ]] ; then
|
||||
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE="${BUILD_CONFIG}")
|
||||
fi
|
||||
|
||||
set -x
|
||||
cmake -S deps -B deps/build "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G Ninja \
|
||||
-DSLIC3R_PCH="${SLIC3R_PRECOMPILED_HEADERS}" \
|
||||
-DDESTDIR="${SCRIPT_PATH}/deps/build/destdir" \
|
||||
-DDEP_DOWNLOAD_DIR="${SCRIPT_PATH}/deps/DL_CACHE" \
|
||||
"${COLORED_OUTPUT}" \
|
||||
"${BUILD_ARGS[@]}"
|
||||
set +x
|
||||
cmake --build deps/build
|
||||
print_and_run cmake -S deps -B deps/$BUILD_DIR "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G Ninja "${COLORED_OUTPUT}" "${BUILD_ARGS[@]}"
|
||||
print_and_run cmake --build deps/$BUILD_DIR
|
||||
fi
|
||||
|
||||
if [[ -n "${BUILD_ORCA}" ]] ; then
|
||||
echo "Configuring OrcaSlicer..."
|
||||
if [[ -n "${CLEAN_BUILD}" ]] ; then
|
||||
rm -fr build
|
||||
print_and_run rm -fr $BUILD_DIR
|
||||
fi
|
||||
read -r -a BUILD_ARGS <<< "${ORCA_EXTRA_BUILD_ARGS}"
|
||||
if [[ -n "${FOUND_GTK3_DEV}" ]] ; then
|
||||
BUILD_ARGS+=(-DSLIC3R_GTK=3)
|
||||
fi
|
||||
if [[ -n "${BUILD_DEBUG}" ]] ; then
|
||||
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE=Debug -DBBL_INTERNAL_TESTING=1)
|
||||
else
|
||||
BUILD_ARGS+=(-DBBL_RELEASE_TO_PUBLIC=1 -DBBL_INTERNAL_TESTING=0)
|
||||
if [[ $BUILD_CONFIG != Release ]] ; then
|
||||
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE="${BUILD_CONFIG}")
|
||||
fi
|
||||
if [[ -n "${BUILD_TESTS}" ]] ; then
|
||||
BUILD_ARGS+=(-DBUILD_TESTS=ON)
|
||||
|
|
@ -229,35 +232,22 @@ if [[ -n "${BUILD_ORCA}" ]] ; then
|
|||
BUILD_ARGS+=(-DORCA_UPDATER_SIG_KEY="${ORCA_UPDATER_SIG_KEY}")
|
||||
fi
|
||||
|
||||
echo "Configuring OrcaSlicer..."
|
||||
set -x
|
||||
cmake -S . -B build "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G "Ninja Multi-Config" \
|
||||
-DSLIC3R_PCH="${SLIC3R_PRECOMPILED_HEADERS}" \
|
||||
-DCMAKE_PREFIX_PATH="${SCRIPT_PATH}/deps/build/destdir/usr/local" \
|
||||
-DSLIC3R_STATIC=1 \
|
||||
-DORCA_TOOLS=ON \
|
||||
"${COLORED_OUTPUT}" \
|
||||
"${BUILD_ARGS[@]}"
|
||||
set +x
|
||||
print_and_run cmake -S . -B $BUILD_DIR "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G "Ninja Multi-Config" \
|
||||
-DSLIC3R_PCH=${SLIC3R_PRECOMPILED_HEADERS} \
|
||||
-DORCA_TOOLS=ON \
|
||||
"${COLORED_OUTPUT}" \
|
||||
"${BUILD_ARGS[@]}"
|
||||
echo "done"
|
||||
echo "Building OrcaSlicer ..."
|
||||
if [[ -n "${BUILD_DEBUG}" ]] ; then
|
||||
cmake --build build --config Debug --target OrcaSlicer
|
||||
else
|
||||
cmake --build build --config Release --target OrcaSlicer
|
||||
fi
|
||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer
|
||||
echo "Building OrcaSlicer_profile_validator .."
|
||||
if [[ -n "${BUILD_DEBUG}" ]] ; then
|
||||
cmake --build build --config Debug --target OrcaSlicer_profile_validator
|
||||
else
|
||||
cmake --build build --config Release --target OrcaSlicer_profile_validator
|
||||
fi
|
||||
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer_profile_validator
|
||||
./scripts/run_gettext.sh
|
||||
echo "done"
|
||||
fi
|
||||
|
||||
if [[ -n "${BUILD_IMAGE}" || -n "${BUILD_ORCA}" ]] ; then
|
||||
pushd build > /dev/null
|
||||
pushd $BUILD_DIR > /dev/null
|
||||
echo "[9/9] Generating Linux app..."
|
||||
build_linux_image="./src/build_linux_image.sh"
|
||||
if [[ -e ${build_linux_image} ]] ; then
|
||||
|
|
@ -265,7 +255,7 @@ if [[ -n "${BUILD_IMAGE}" || -n "${BUILD_ORCA}" ]] ; then
|
|||
if [[ -n "${BUILD_IMAGE}" ]] ; then
|
||||
extra_script_args="-i"
|
||||
fi
|
||||
${build_linux_image} ${extra_script_args}
|
||||
print_and_run ${build_linux_image} ${extra_script_args}
|
||||
|
||||
echo "done"
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ if "%1"=="slicer" (
|
|||
)
|
||||
echo "building deps.."
|
||||
|
||||
echo cmake ../ -G "Visual Studio 16 2019" -A x64 -DDESTDIR="%CD%/OrcaSlicer_dep" -DCMAKE_BUILD_TYPE=%build_type% -DDEP_DEBUG=%debug% -DORCA_INCLUDE_DEBUG_INFO=%debuginfo%
|
||||
cmake ../ -G "Visual Studio 16 2019" -A x64 -DDESTDIR="%CD%/OrcaSlicer_dep" -DCMAKE_BUILD_TYPE=%build_type% -DDEP_DEBUG=%debug% -DORCA_INCLUDE_DEBUG_INFO=%debuginfo%
|
||||
echo cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake --build . --config %build_type% --target deps -- -m
|
||||
|
||||
if "%1"=="deps" exit /b 0
|
||||
|
|
@ -43,8 +43,8 @@ cd %WP%
|
|||
mkdir %build_dir%
|
||||
cd %build_dir%
|
||||
|
||||
echo cmake .. -G "Visual Studio 16 2019" -A x64 -DBBL_RELEASE_TO_PUBLIC=1 -DCMAKE_PREFIX_PATH="%DEPS%/usr/local" -DCMAKE_INSTALL_PREFIX="./OrcaSlicer" -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake .. -G "Visual Studio 16 2019" -A x64 -DBBL_RELEASE_TO_PUBLIC=1 %SIG_FLAG% -DCMAKE_PREFIX_PATH="%DEPS%/usr/local" -DCMAKE_INSTALL_PREFIX="./OrcaSlicer" -DCMAKE_BUILD_TYPE=%build_type% -DWIN10SDK_PATH="C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0"
|
||||
echo cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type% %SIG_FLAG%
|
||||
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
||||
cd ..
|
||||
call scripts/run_gettext.bat
|
||||
|
|
|
|||
|
|
@ -109,8 +109,6 @@ echo
|
|||
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_BUILD_DIR="$PROJECT_DIR/build/$ARCH"
|
||||
DEPS_DIR="$PROJECT_DIR/deps"
|
||||
DEPS_BUILD_DIR="$DEPS_DIR/build/$ARCH"
|
||||
DEPS="$DEPS_BUILD_DIR/OrcaSlicer_deps"
|
||||
|
||||
# For Multi-config generators like Ninja and Xcode
|
||||
export BUILD_DIR_CONFIG_SUBDIR="/$BUILD_CONFIG"
|
||||
|
|
@ -133,8 +131,6 @@ function build_deps() {
|
|||
if [ "1." != "$BUILD_ONLY". ]; then
|
||||
cmake "${DEPS_DIR}" \
|
||||
-G "${DEPS_CMAKE_GENERATOR}" \
|
||||
-DDESTDIR="$DEPS" \
|
||||
-DOPENSSL_ARCH="darwin64-${_ARCH}-cc" \
|
||||
-DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \
|
||||
-DCMAKE_OSX_ARCHITECTURES:STRING="${_ARCH}" \
|
||||
-DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}"
|
||||
|
|
@ -172,15 +168,9 @@ function build_slicer() {
|
|||
if [ "1." != "$BUILD_ONLY". ]; then
|
||||
cmake "${PROJECT_DIR}" \
|
||||
-G "${SLICER_CMAKE_GENERATOR}" \
|
||||
-DBBL_RELEASE_TO_PUBLIC=1 \
|
||||
-DORCA_TOOLS=ON \
|
||||
${ORCA_UPDATER_SIG_KEY:+-DORCA_UPDATER_SIG_KEY="$ORCA_UPDATER_SIG_KEY"} \
|
||||
-DCMAKE_PREFIX_PATH="$DEPS/usr/local" \
|
||||
-DCMAKE_INSTALL_PREFIX="$PWD/OrcaSlicer" \
|
||||
-DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \
|
||||
-DCMAKE_MACOSX_RPATH=ON \
|
||||
-DCMAKE_INSTALL_RPATH="${DEPS}/usr/local" \
|
||||
-DCMAKE_MACOSX_BUNDLE=ON \
|
||||
-DCMAKE_OSX_ARCHITECTURES="${_ARCH}" \
|
||||
-DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}"
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ setlocal DISABLEDELAYEDEXPANSION
|
|||
cd deps
|
||||
mkdir %build_dir%
|
||||
cd %build_dir%
|
||||
set DEPS=%CD%/OrcaSlicer_dep
|
||||
set "SIG_FLAG="
|
||||
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
||||
|
||||
|
|
@ -47,7 +46,7 @@ if "%1"=="slicer" (
|
|||
echo "building deps.."
|
||||
|
||||
echo on
|
||||
cmake ../ -G "Visual Studio 17 2022" -A x64 -DDESTDIR="%DEPS%" -DCMAKE_BUILD_TYPE=%build_type% -DDEP_DEBUG=%debug% -DORCA_INCLUDE_DEBUG_INFO=%debuginfo%
|
||||
cmake ../ -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake --build . --config %build_type% --target deps -- -m
|
||||
@echo off
|
||||
|
||||
|
|
@ -60,7 +59,7 @@ mkdir %build_dir%
|
|||
cd %build_dir%
|
||||
|
||||
echo on
|
||||
cmake .. -G "Visual Studio 17 2022" -A x64 -DBBL_RELEASE_TO_PUBLIC=1 -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_PREFIX_PATH="%DEPS%/usr/local" -DCMAKE_INSTALL_PREFIX="./OrcaSlicer" -DCMAKE_BUILD_TYPE=%build_type% -DWIN10SDK_PATH="%WindowsSdkDir%Include\%WindowsSDKVersion%\"
|
||||
cmake .. -G "Visual Studio 17 2022" -A x64 -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_BUILD_TYPE=%build_type%
|
||||
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
||||
@echo off
|
||||
cd ..
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ find_library(GLEW_STATIC_LIBRARY_RELEASE
|
|||
PATHS ENV GLEW_ROOT)
|
||||
|
||||
find_library(GLEW_STATIC_LIBRARY_DEBUG
|
||||
NAMES GLEWds glewd glewds glew32ds
|
||||
NAMES GLEWds GLEWd glewd glewds glew32ds
|
||||
PATH_SUFFIXES lib lib64
|
||||
PATHS ENV GLEW_ROOT)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,13 +3,6 @@
|
|||
#//
|
||||
#// Description:
|
||||
#// cmake module for finding NLopt installation
|
||||
#// NLopt installation location is defined by environment variable $NLOPT
|
||||
#//
|
||||
#// following variables are defined:
|
||||
#// NLopt_DIR - NLopt installation directory
|
||||
#// NLopt_INCLUDE_DIR - NLopt header directory
|
||||
#// NLopt_LIBRARY_DIR - NLopt library directory
|
||||
#// NLopt_LIBS - NLopt library files
|
||||
#//
|
||||
#// Example usage:
|
||||
#// find_package(NLopt 1.4 REQUIRED)
|
||||
|
|
@ -17,114 +10,27 @@
|
|||
#//
|
||||
#//-------------------------------------------------------------------------
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "")
|
||||
set(NLopt_DEFINITIONS "")
|
||||
unset(NLopt_LIBS CACHE)
|
||||
|
||||
set(NLopt_DIR $ENV{NLOPT})
|
||||
if(NOT NLopt_DIR)
|
||||
|
||||
set(NLopt_FOUND TRUE)
|
||||
|
||||
set(_NLopt_LIB_NAMES "nlopt")
|
||||
find_library(NLopt_LIBS
|
||||
NAMES ${_NLopt_LIB_NAMES})
|
||||
if(NOT NLopt_LIBS)
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Cannot find NLopt library '${_NLopt_LIB_NAMES}'.")
|
||||
else()
|
||||
get_filename_component(NLopt_DIR ${NLopt_LIBS} PATH)
|
||||
endif()
|
||||
unset(_NLopt_LIB_NAMES)
|
||||
|
||||
set(_NLopt_HEADER_FILE_NAME "nlopt.hpp")
|
||||
find_file(_NLopt_HEADER_FILE
|
||||
NAMES ${_NLopt_HEADER_FILE_NAME})
|
||||
if(NOT _NLopt_HEADER_FILE)
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Cannot find NLopt header file '${_NLopt_HEADER_FILE_NAME}'.")
|
||||
endif()
|
||||
unset(_NLopt_HEADER_FILE_NAME)
|
||||
|
||||
if(NOT NLopt_FOUND)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} NLopt not found in system directories (and environment variable NLOPT is not set).")
|
||||
else()
|
||||
get_filename_component(NLopt_INCLUDE_DIR ${_NLopt_HEADER_FILE} DIRECTORY )
|
||||
endif()
|
||||
|
||||
unset(_NLopt_HEADER_FILE CACHE)
|
||||
|
||||
else()
|
||||
|
||||
set(NLopt_FOUND TRUE)
|
||||
|
||||
set(NLopt_INCLUDE_DIR "${NLopt_DIR}/include")
|
||||
if(NOT EXISTS "${NLopt_INCLUDE_DIR}")
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Directory '${NLopt_INCLUDE_DIR}' does not exist.")
|
||||
endif()
|
||||
|
||||
set(NLopt_LIBRARY_DIR "${NLopt_DIR}/lib")
|
||||
if(NOT EXISTS "${NLopt_LIBRARY_DIR}")
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Directory '${NLopt_LIBRARY_DIR}' does not exist.")
|
||||
endif()
|
||||
|
||||
set(_NLopt_LIB_NAMES "nlopt_cxx")
|
||||
find_library(NLopt_LIBS
|
||||
NAMES ${_NLopt_LIB_NAMES}
|
||||
PATHS ${NLopt_LIBRARY_DIR}
|
||||
NO_DEFAULT_PATH)
|
||||
if(NOT NLopt_LIBS)
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Cannot find NLopt library '${_NLopt_LIB_NAMES}' in '${NLopt_LIBRARY_DIR}'.")
|
||||
endif()
|
||||
unset(_NLopt_LIB_NAMES)
|
||||
|
||||
set(_NLopt_HEADER_FILE_NAME "nlopt.hpp")
|
||||
find_file(_NLopt_HEADER_FILE
|
||||
NAMES ${_NLopt_HEADER_FILE_NAME}
|
||||
PATHS ${NLopt_INCLUDE_DIR}
|
||||
NO_DEFAULT_PATH)
|
||||
if(NOT _NLopt_HEADER_FILE)
|
||||
set(NLopt_FOUND FALSE)
|
||||
set(NLopt_ERROR_REASON "${NLopt_ERROR_REASON} Cannot find NLopt header file '${_NLopt_HEADER_FILE_NAME}' in '${NLopt_INCLUDE_DIR}'.")
|
||||
endif()
|
||||
unset(_NLopt_HEADER_FILE_NAME)
|
||||
unset(_NLopt_HEADER_FILE CACHE)
|
||||
|
||||
endif()
|
||||
|
||||
|
||||
# make variables changeable
|
||||
mark_as_advanced(
|
||||
NLopt_INCLUDE_DIR
|
||||
NLopt_LIBRARY_DIR
|
||||
NLopt_LIBS
|
||||
NLopt_DEFINITIONS
|
||||
)
|
||||
unset(_q)
|
||||
if (NLopt_FIND_QUIETLY)
|
||||
set(_q QUIET)
|
||||
endif ()
|
||||
|
||||
find_package(NLopt ${NLopt_VERSION} CONFIG ${_q})
|
||||
find_package_handle_standard_args(NLopt CONFIG_MODE)
|
||||
|
||||
# report result
|
||||
if(NLopt_FOUND)
|
||||
message(STATUS "Found NLopt in '${NLopt_DIR}'.")
|
||||
message(STATUS "Using NLopt include directory '${NLopt_INCLUDE_DIR}'.")
|
||||
message(STATUS "Using NLopt library '${NLopt_LIBS}'.")
|
||||
add_library(NLopt::nlopt INTERFACE IMPORTED)
|
||||
set_target_properties(NLopt::nlopt PROPERTIES INTERFACE_LINK_LIBRARIES ${NLopt_LIBS})
|
||||
set_target_properties(NLopt::nlopt PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${NLopt_INCLUDE_DIR})
|
||||
set_target_properties(NLopt::nlopt PROPERTIES INTERFACE_COMPILE_DEFINITIONS "${NLopt_DEFINITIONS}")
|
||||
# target_link_libraries(Nlopt::Nlopt INTERFACE ${NLopt_LIBS})
|
||||
# target_include_directories(Nlopt::Nlopt INTERFACE ${NLopt_INCLUDE_DIR})
|
||||
# target_compile_definitions(Nlopt::Nlopt INTERFACE ${NLopt_DEFINITIONS})
|
||||
else()
|
||||
if(NLopt_FIND_REQUIRED)
|
||||
message(FATAL_ERROR "Unable to find requested NLopt installation:${NLopt_ERROR_REASON}")
|
||||
else()
|
||||
if(NOT NLopt_FIND_QUIETLY)
|
||||
message(STATUS "NLopt was not found:${NLopt_ERROR_REASON}")
|
||||
endif()
|
||||
endif()
|
||||
if(NLopt_FOUND AND NOT _q)
|
||||
get_filename_component(NLOPT_LIBRARY_DIRS ${NLOPT_LIBRARY_DIRS} ABSOLUTE)
|
||||
get_filename_component(NLOPT_INCLUDE_DIRS ${NLOPT_INCLUDE_DIRS} ABSOLUTE)
|
||||
|
||||
message(STATUS "Found NLopt in '${NLOPT_LIBRARY_DIRS}'.")
|
||||
message(STATUS "Using NLopt include directory '${NLOPT_INCLUDE_DIRS}'.")
|
||||
|
||||
get_target_property(_configs NLopt::nlopt IMPORTED_CONFIGURATIONS)
|
||||
foreach (_config ${_configs})
|
||||
get_target_property(_lib NLopt::nlopt IMPORTED_LOCATION_${_config})
|
||||
message(STATUS "Found NLopt ${_config} library: ${_lib}")
|
||||
endforeach ()
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -1,15 +1,41 @@
|
|||
find_path(LIBNOISE_INCLUDE_DIR libnoise/noise.h)
|
||||
find_library(LIBNOISE_LIBRARY NAMES libnoise libnoise_static liblibnoise_static)
|
||||
find_library(LIBNOISE_LIBRARY_RELEASE NAMES libnoise libnoise_static liblibnoise_static)
|
||||
find_library(LIBNOISE_LIBRARY_DEBUG NAMES libnoised libnoise_staticd liblibnoise_staticd)
|
||||
|
||||
set(libnoise_LIB_FOUND FALSE)
|
||||
if (LIBNOISE_LIBRARY_RELEASE OR LIBNOISE_LIBRARY_DEBUG)
|
||||
set(libnoise_LIB_FOUND TRUE)
|
||||
endif ()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(libnoise DEFAULT_MSG
|
||||
LIBNOISE_LIBRARY
|
||||
libnoise_LIB_FOUND
|
||||
LIBNOISE_INCLUDE_DIR
|
||||
)
|
||||
|
||||
if(libnoise_FOUND)
|
||||
add_library(noise::noise STATIC IMPORTED)
|
||||
|
||||
set_target_properties(noise::noise PROPERTIES
|
||||
IMPORTED_LOCATION "${LIBNOISE_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${LIBNOISE_INCLUDE_DIR}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${LIBNOISE_INCLUDE_DIR}"
|
||||
)
|
||||
if (NOT libnoise_FIND_QUIETLY)
|
||||
message(STATUS "Found libnoise include directory: ${LIBNOISE_INCLUDE_DIR}")
|
||||
if (LIBNOISE_LIBRARY_RELEASE)
|
||||
message(STATUS "Found libnoise RELEASE library: ${LIBNOISE_LIBRARY_RELEASE}")
|
||||
endif ()
|
||||
if (LIBNOISE_LIBRARY_DEBUG)
|
||||
message(STATUS "Found libnoise DEBUG library: ${LIBNOISE_LIBRARY_DEBUG}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if (LIBNOISE_LIBRARY_RELEASE)
|
||||
set_property(TARGET noise::noise APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||
set_target_properties(noise::noise PROPERTIES IMPORTED_LOCATION_RELEASE ${LIBNOISE_LIBRARY_RELEASE})
|
||||
endif ()
|
||||
|
||||
if (LIBNOISE_LIBRARY_DEBUG)
|
||||
set_property(TARGET noise::noise APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||
set_target_properties(noise::noise PROPERTIES IMPORTED_LOCATION_DEBUG ${LIBNOISE_LIBRARY_DEBUG})
|
||||
endif ()
|
||||
endif()
|
||||
112
deps/CMakeLists.txt
vendored
|
|
@ -36,6 +36,11 @@ endif()
|
|||
|
||||
project(OrcaSlicer-deps)
|
||||
|
||||
# Backward compatibility for old CMake versions
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_VERSION VERSION_LESS "3.25")
|
||||
set(LINUX ON CACHE BOOL "" FORCE)
|
||||
endif ()
|
||||
|
||||
include(ExternalProject)
|
||||
include(ProcessorCount)
|
||||
|
||||
|
|
@ -44,9 +49,36 @@ if (NPROC EQUAL 0)
|
|||
set(NPROC 1)
|
||||
endif ()
|
||||
|
||||
set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination directory")
|
||||
set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/DL_CACHE CACHE PATH "Path for downloaded source packages.")
|
||||
set(FLATPAK FALSE CACHE BOOL "Toggles various build settings for flatpak, like /usr/local in DESTDIR or not building wxwidgets")
|
||||
|
||||
if ("${DESTDIR}" STREQUAL "" OR "${DESTDIR}" STREQUAL "${AUTOGENERATED_DESTDIR}")
|
||||
if (LINUX AND (NOT DEFINED USE_OLD_DESTDIR_PREV OR USE_OLD_DESTDIR_PREV) AND EXISTS "${CMAKE_BINARY_DIR}/destdir/usr/local" AND NOT EXISTS "${CMAKE_BINARY_DIR}/OrcaSlicer_dep/usr/local")
|
||||
set(USE_OLD_DESTDIR TRUE)
|
||||
message(WARNING "You are using an old directory name for dependencies that is being deprecated. "
|
||||
"Please remove the \"destdir\" directory and rebuild to update to the new name. "
|
||||
"The current \"destdir\" directory will be used until then.")
|
||||
endif ()
|
||||
if (NOT USE_OLD_DESTDIR AND USE_OLD_DESTDIR_PREV)
|
||||
set(REGEN_DESTDIR TRUE)
|
||||
endif ()
|
||||
else ()
|
||||
unset(AUTOGENERATED_DESTDIR CACHE)
|
||||
endif ()
|
||||
|
||||
if ("${DESTDIR}" STREQUAL "" OR REGEN_DESTDIR)
|
||||
if (USE_OLD_DESTDIR) # backward compatibility for old directory name
|
||||
set(DESTDIR "${CMAKE_BINARY_DIR}/destdir" CACHE PATH "Path to dependencies install directory" FORCE)
|
||||
else ()
|
||||
set(DESTDIR "${CMAKE_BINARY_DIR}/OrcaSlicer_dep" CACHE PATH "Path to dependencies install directory" FORCE)
|
||||
endif ()
|
||||
set(DESTDIR_MSG "(generated automatically and saved to cache)")
|
||||
set(AUTOGENERATED_DESTDIR ${DESTDIR} CACHE STRING "Provides the last autogenerated destdir" FORCE)
|
||||
unset(REGEN_DESTDIR CACHE)
|
||||
else ()
|
||||
set(DESTDIR_MSG "(from cache or command line)")
|
||||
endif ()
|
||||
|
||||
if (NOT FLATPAK)
|
||||
set(DESTDIR "${DESTDIR}/usr/local/")
|
||||
endif()
|
||||
|
|
@ -56,15 +88,32 @@ get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
|||
if (_is_multi)
|
||||
option(DEP_DEBUG "Build debug variants (only applicable on Windows)" OFF)
|
||||
option(ORCA_INCLUDE_DEBUG_INFO "Includes debug information in a release build (like RelWithDebInfo) in a way that works with multi-configuration generators and incompatible dependencies. DEP_DEBUG option takes priority over this." OFF)
|
||||
option(AUTO_DEBUG_WORKAROUND "Automatically sets DEP_DEBUG and ORCA_INCLUDE_DEBUG_INFO based on CMAKE_BUILD_TYPE" ON)
|
||||
|
||||
if (AUTO_DEBUG_WORKAROUND)
|
||||
set(DEP_DEBUG OFF)
|
||||
set(ORCA_INCLUDE_DEBUG_INFO OFF)
|
||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(DEP_DEBUG ON)
|
||||
message(STATUS "DEP_DEBUG has been automatically turned ON due to CMAKE_BUILD_TYPE being set to Debug")
|
||||
elseif (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
||||
set(ORCA_INCLUDE_DEBUG_INFO ON)
|
||||
message(STATUS "ORCA_INCLUDE_DEBUG_INFO has been automatically turned ON due to CMAKE_BUILD_TYPE being set to RelWithDebInfo")
|
||||
endif ()
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
option(DEP_WX_GTK3 "Build wxWidgets against GTK3" OFF)
|
||||
option(DEP_WX_GTK3 "Build wxWidgets against GTK3" ON)
|
||||
endif()
|
||||
|
||||
set(IS_CROSS_COMPILE FALSE)
|
||||
|
||||
if (APPLE)
|
||||
list(LENGTH CMAKE_OSX_ARCHITECTURES _arch_len)
|
||||
if (_arch_len GREATER 1)
|
||||
message(FATAL_ERROR "OrcaSlicer only supports building for one architecture at a time. Please make sure only one architecture is specified in CMAKE_OSX_ARCHITECTURES")
|
||||
endif ()
|
||||
set(CMAKE_FIND_FRAMEWORK LAST)
|
||||
set(CMAKE_FIND_APPBUNDLE LAST)
|
||||
list(FIND CMAKE_OSX_ARCHITECTURES ${CMAKE_SYSTEM_PROCESSOR} _arch_idx)
|
||||
|
|
@ -87,7 +136,7 @@ endif ()
|
|||
# Slic3r compiles with a different version which will cause runtime errors.
|
||||
# option(DEP_BUILD_IGL_STATIC "Build IGL as a static library. Might cause link errors and increase binary size." OFF)
|
||||
|
||||
message(STATUS "OrcaSlicer deps DESTDIR: ${DESTDIR}")
|
||||
message(STATUS "OrcaSlicer deps DESTDIR: ${DESTDIR} ${DESTDIR_MSG}")
|
||||
message(STATUS "OrcaSlicer download dir for source packages: ${DEP_DOWNLOAD_DIR}")
|
||||
message(STATUS "OrcaSlicer deps debug build: ${DEP_DEBUG}")
|
||||
|
||||
|
|
@ -144,39 +193,26 @@ if (NOT IS_CROSS_COMPILE OR NOT APPLE)
|
|||
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release -- ${_build_j}
|
||||
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Release
|
||||
)
|
||||
elseif(FLATPAK)
|
||||
# the only reason this is here is because of the HACK at the bottom for ci
|
||||
#
|
||||
# note for future devs: shared libs may actually create a size reduction
|
||||
# but orcaslicer_deps tends to get really funny regarding linking after that (notably boost)
|
||||
# so, as much as I would like to use that, it's not happening
|
||||
ExternalProject_Add(
|
||||
dep_${projectname}
|
||||
EXCLUDE_FROM_ALL ON
|
||||
INSTALL_DIR ${DESTDIR}
|
||||
DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname}
|
||||
${_gen}
|
||||
CMAKE_ARGS
|
||||
-DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}
|
||||
-DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules
|
||||
-DCMAKE_PREFIX_PATH:STRING=${DESTDIR}
|
||||
-DCMAKE_DEBUG_POSTFIX:STRING=d
|
||||
-DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
|
||||
-DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
|
||||
-DCMAKE_TOOLCHAIN_FILE:STRING=${CMAKE_TOOLCHAIN_FILE}
|
||||
-DBUILD_SHARED_LIBS:BOOL=OFF
|
||||
${_cmake_osx_arch}
|
||||
"${_configs_line}"
|
||||
${DEP_CMAKE_OPTS}
|
||||
${P_ARGS_CMAKE_ARGS}
|
||||
${P_ARGS_UNPARSED_ARGUMENTS}
|
||||
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release -- ${_build_j}
|
||||
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Release
|
||||
# HACK: save space after each compile job, because CI
|
||||
# reasoning: cmake changes directory after this command, so just keep only the folders
|
||||
# so that it can navigate out
|
||||
COMMAND find "${CMAKE_BINARY_DIR}/dep_${projectname}-prefix/" -type f -delete
|
||||
)
|
||||
|
||||
if (FLATPAK)
|
||||
# Free up space during flatpak builds to prevent running out of space during CI/CD
|
||||
|
||||
# note for future devs: shared libs may actually create a size reduction
|
||||
# but orcaslicer_deps tends to get really funny regarding linking after that (notably boost)
|
||||
# so, as much as I would like to use that, it's not happening
|
||||
ExternalProject_Add_Step(dep_${projectname} free_download_space
|
||||
DEPENDEES download # do after download
|
||||
COMMENT "Freeing Space: Removing source archive"
|
||||
WORKING_DIRECTORY ${DEP_DOWNLOAD_DIR}
|
||||
COMMAND ${CMAKE_COMMAND} -E rm -r ${projectname}
|
||||
)
|
||||
ExternalProject_Add_Step(dep_${projectname} free_build_space
|
||||
DEPENDEES install # do after install
|
||||
COMMENT "Freeing Space: Removing source and build files"
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/dep_${projectname}-prefix/src
|
||||
COMMAND ${CMAKE_COMMAND} -E rm -rf dep_${projectname} dep_${projectname}-build
|
||||
)
|
||||
endif ()
|
||||
else()
|
||||
ExternalProject_Add(
|
||||
dep_${projectname}
|
||||
|
|
@ -320,10 +356,10 @@ if (NOT JPEG_FOUND)
|
|||
set(JPEG_PKG dep_JPEG)
|
||||
endif()
|
||||
|
||||
# flatpak builds wxwidgets separately
|
||||
# flatpak builds wxwidgets separately, so it is not included in the deps target
|
||||
set(WXWIDGETS_PKG "")
|
||||
include(wxWidgets/wxWidgets.cmake)
|
||||
if (NOT FLATPAK)
|
||||
include(wxWidgets/wxWidgets.cmake)
|
||||
set(WXWIDGETS_PKG "dep_wxWidgets")
|
||||
endif()
|
||||
|
||||
|
|
|
|||
1
deps/OpenCV/OpenCV.cmake
vendored
|
|
@ -53,6 +53,7 @@ orcaslicer_add_cmake_project(OpenCV
|
|||
-DWITH_OPENJPEG=OFF
|
||||
-DWITH_QUIRC=OFF
|
||||
-DWITH_VTK=OFF
|
||||
-DWITH_JPEG=OFF
|
||||
-DWITH_WEBP=OFF
|
||||
-DENABLE_PRECOMPILED_HEADERS=OFF
|
||||
-DINSTALL_TESTS=OFF
|
||||
|
|
|
|||
2
deps/OpenSSL/OpenSSL.cmake
vendored
|
|
@ -8,7 +8,7 @@ else()
|
|||
if(WIN32)
|
||||
set(_cross_arch "VC-WIN64A")
|
||||
elseif(APPLE)
|
||||
set(_cross_arch "darwin64-arm64-cc")
|
||||
set(_cross_arch "darwin64-${CMAKE_OSX_ARCHITECTURES}-cc")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
|
|
|||
23
deps/wxWidgets/wxWidgets.cmake
vendored
|
|
@ -1,5 +1,7 @@
|
|||
set(_wx_toolkit "")
|
||||
set(_wx_private_font "-DwxUSE_PRIVATE_FONTS=1")
|
||||
set(_wx_debug_postfix "")
|
||||
set(_wx_shared -DwxBUILD_SHARED=OFF)
|
||||
set(_wx_flatpak_patch "")
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
set(_gtk_ver 2)
|
||||
|
|
@ -9,6 +11,11 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|||
endif ()
|
||||
|
||||
set(_wx_toolkit "-DwxBUILD_TOOLKIT=gtk${_gtk_ver}")
|
||||
if (FLATPAK)
|
||||
set(_wx_debug_postfix "d")
|
||||
set(_wx_shared -DwxBUILD_SHARED=ON -DBUILD_SHARED_LIBS:BOOL=ON)
|
||||
set(_wx_flatpak_patch PATCH_COMMAND ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/0001-flatpak.patch)
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
if (MSVC)
|
||||
|
|
@ -17,34 +24,29 @@ else ()
|
|||
set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF")
|
||||
endif ()
|
||||
|
||||
# Note: The flatpak build builds wxwidgets separately due to CI size constraints.
|
||||
# ANY CHANGES MADE IN HERE MUST ALSO BE REFLECTED IN `scripts/flatpak/io.github.SoftFever.OrcaSlicer.yml`.
|
||||
# ** THIS INCLUDES BUILD ARGS. **
|
||||
# ...if you can find a way around this size limitation, be my guest.
|
||||
|
||||
orcaslicer_add_cmake_project(
|
||||
wxWidgets
|
||||
GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets"
|
||||
GIT_SHALLOW ON
|
||||
DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG}
|
||||
${_wx_flatpak_patch}
|
||||
CMAKE_ARGS
|
||||
-DwxBUILD_PRECOMP=ON
|
||||
${_wx_toolkit}
|
||||
"-DCMAKE_DEBUG_POSTFIX:STRING="
|
||||
"-DCMAKE_DEBUG_POSTFIX:STRING=${_wx_debug_postfix}"
|
||||
-DwxBUILD_DEBUG_LEVEL=0
|
||||
-DwxBUILD_SAMPLES=OFF
|
||||
-DwxBUILD_SHARED=OFF
|
||||
${_wx_shared}
|
||||
-DwxUSE_MEDIACTRL=ON
|
||||
-DwxUSE_DETECT_SM=OFF
|
||||
-DwxUSE_UNICODE=ON
|
||||
${_wx_private_font}
|
||||
-DwxUSE_PRIVATE_FONTS=ON
|
||||
-DwxUSE_OPENGL=ON
|
||||
-DwxUSE_WEBREQUEST=ON
|
||||
-DwxUSE_WEBVIEW=ON
|
||||
${_wx_edge}
|
||||
-DwxUSE_WEBVIEW_IE=OFF
|
||||
-DwxUSE_REGEX=builtin
|
||||
-DwxUSE_LIBXPM=builtin
|
||||
-DwxUSE_LIBSDL=OFF
|
||||
-DwxUSE_XTEST=OFF
|
||||
-DwxUSE_STC=OFF
|
||||
|
|
@ -53,7 +55,6 @@ orcaslicer_add_cmake_project(
|
|||
-DwxUSE_ZLIB=sys
|
||||
-DwxUSE_LIBJPEG=sys
|
||||
-DwxUSE_LIBTIFF=OFF
|
||||
-DwxUSE_NANOSVG=OFF
|
||||
-DwxUSE_EXPAT=sys
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ project(deps_src)
|
|||
# Header-only libraries (INTERFACE)
|
||||
add_subdirectory(agg)
|
||||
add_subdirectory(ankerl)
|
||||
add_subdirectory(earcut)
|
||||
add_subdirectory(fast_float)
|
||||
add_subdirectory(nanosvg)
|
||||
add_subdirectory(nlohmann)
|
||||
|
|
|
|||
27
deps_src/earcut/CHANGELOG.md
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
## Earcut.hpp changelog
|
||||
|
||||
### master
|
||||
|
||||
- Fixed a bunch of rare edge cases that led to bad triangulation (parity with Earcut v2.2.2)
|
||||
- Removed use of deprecated `std::allocator::construct`
|
||||
- Fixed a minor z-order hashing bug
|
||||
- Improved visualization app, better docs
|
||||
|
||||
### v0.12.4
|
||||
|
||||
- Fixed a crash in Crash in Earcut::findHoleBridge
|
||||
- Added coverage checks
|
||||
- Added macOS, MinGW builds
|
||||
|
||||
### v0.12.3
|
||||
|
||||
- Fixed -Wunused-lambda-capture
|
||||
|
||||
### v0.12.2
|
||||
|
||||
- Fixed potential division by zero
|
||||
- Fixed -fsanitize=integer warning
|
||||
|
||||
### v0.12.1
|
||||
|
||||
- Fixed cast precision warning
|
||||
13
deps_src/earcut/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
cmake_minimum_required(VERSION 3.13)
|
||||
project(earcut)
|
||||
|
||||
add_library(earcut INTERFACE)
|
||||
|
||||
target_include_directories(earcut SYSTEM
|
||||
INTERFACE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
|
||||
target_sources(earcut INTERFACE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/earcut.hpp
|
||||
)
|
||||
15
deps_src/earcut/LICENSE
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
ISC License
|
||||
|
||||
Copyright (c) 2015, Mapbox
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any purpose
|
||||
with or without fee is hereby granted, provided that the above copyright notice
|
||||
and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||
THIS SOFTWARE.
|
||||
131
deps_src/earcut/README.md
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
## Earcut
|
||||
|
||||
A C++ port of [earcut.js](https://github.com/mapbox/earcut), a fast, [header-only](https://github.com/mapbox/earcut.hpp/blob/master/include/mapbox/earcut.hpp) polygon triangulation library.
|
||||
|
||||
[](https://travis-ci.com/github/mapbox/earcut.hpp)
|
||||
[](https://ci.appveyor.com/project/Mapbox/earcut-hpp-8wm4o/branch/master)
|
||||
[](https://coveralls.io/github/mapbox/earcut.hpp)
|
||||
[](https://scan.coverity.com/projects/14000)
|
||||
[](http://isitmaintained.com/project/mapbox/earcut.hpp "Average time to resolve an issue")
|
||||
[](http://isitmaintained.com/project/mapbox/earcut.hpp "Percentage of issues still open")
|
||||
[](https://github.com/mourner/projects)
|
||||
|
||||
The library implements a modified ear slicing algorithm, optimized by [z-order curve](http://en.wikipedia.org/wiki/Z-order_curve) hashing and extended to handle holes, twisted polygons, degeneracies and self-intersections in a way that doesn't _guarantee_ correctness of triangulation, but attempts to always produce acceptable results for practical data like geographical shapes.
|
||||
|
||||
It's based on ideas from [FIST: Fast Industrial-Strength Triangulation of Polygons](http://www.cosy.sbg.ac.at/~held/projects/triang/triang.html) by Martin Held and [Triangulation by Ear Clipping](http://www.geometrictools.com/Documentation/TriangulationByEarClipping.pdf) by David Eberly.
|
||||
|
||||
## Usage
|
||||
|
||||
```cpp
|
||||
#include <earcut.hpp>
|
||||
```
|
||||
```cpp
|
||||
// The number type to use for tessellation
|
||||
using Coord = double;
|
||||
|
||||
// The index type. Defaults to uint32_t, but you can also pass uint16_t if you know that your
|
||||
// data won't have more than 65536 vertices.
|
||||
using N = uint32_t;
|
||||
|
||||
// Create array
|
||||
using Point = std::array<Coord, 2>;
|
||||
std::vector<std::vector<Point>> polygon;
|
||||
|
||||
// Fill polygon structure with actual data. Any winding order works.
|
||||
// The first polyline defines the main polygon.
|
||||
polygon.push_back({{100, 0}, {100, 100}, {0, 100}, {0, 0}});
|
||||
// Following polylines define holes.
|
||||
polygon.push_back({{75, 25}, {75, 75}, {25, 75}, {25, 25}});
|
||||
|
||||
// Run tessellation
|
||||
// Returns array of indices that refer to the vertices of the input polygon.
|
||||
// e.g: the index 6 would refer to {25, 75} in this example.
|
||||
// Three subsequent indices form a triangle. Output triangles are clockwise.
|
||||
std::vector<N> indices = mapbox::earcut<N>(polygon);
|
||||
```
|
||||
|
||||
Earcut can triangulate a simple, planar polygon of any winding order including holes. It will even return a robust, acceptable solution for non-simple poygons. Earcut works on a 2D plane. If you have three or more dimensions, you can project them onto a 2D surface before triangulation, or use a more suitable library for the task (e.g [CGAL](https://doc.cgal.org/latest/Triangulation_3/index.html)).
|
||||
|
||||
|
||||
It is also possible to use your custom point type as input. There are default accessors defined for `std::tuple`, `std::pair`, and `std::array`. For a custom type (like Clipper's `IntPoint` type), do this:
|
||||
|
||||
```cpp
|
||||
// struct IntPoint {
|
||||
// int64_t X, Y;
|
||||
// };
|
||||
|
||||
namespace mapbox {
|
||||
namespace util {
|
||||
|
||||
template <>
|
||||
struct nth<0, IntPoint> {
|
||||
inline static auto get(const IntPoint &t) {
|
||||
return t.X;
|
||||
};
|
||||
};
|
||||
template <>
|
||||
struct nth<1, IntPoint> {
|
||||
inline static auto get(const IntPoint &t) {
|
||||
return t.Y;
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace util
|
||||
} // namespace mapbox
|
||||
```
|
||||
|
||||
You can also use a custom container type for your polygon. Similar to std::vector<T>, it has to meet the requirements of [Container](https://en.cppreference.com/w/cpp/named_req/Container), in particular `size()`, `empty()` and `operator[]`.
|
||||
|
||||
<p align="center">
|
||||
<img src="https://camo.githubusercontent.com/01836f8ba21af844c93d8d3145f4e9976025a696/68747470733a2f2f692e696d6775722e636f6d2f67314e704c54712e706e67" alt="example triangulation"/>
|
||||
</p>
|
||||
|
||||
## Additional build instructions
|
||||
In case you just want to use the earcut triangulation library; copy and include the header file [`<earcut.hpp>`](https://github.com/mapbox/earcut.hpp/blob/master/include/mapbox/earcut.hpp) in your project and follow the steps documented in the section [Usage](#usage).
|
||||
|
||||
If you want to build the test, benchmark and visualization programs instead, follow these instructions:
|
||||
|
||||
### Dependencies
|
||||
|
||||
Before you continue, make sure to have the following tools and libraries installed:
|
||||
* git ([Ubuntu](https://help.ubuntu.com/lts/serverguide/git.html)/[Windows/macOS](http://git-scm.com/downloads))
|
||||
* cmake 3.2+ ([Ubuntu](https://launchpad.net/~george-edison55/+archive/ubuntu/cmake-3.x)/[Windows/macOS](https://cmake.org/download/))
|
||||
* OpenGL SDK ([Ubuntu](http://packages.ubuntu.com/de/trusty/libgl1-mesa-dev)/[Windows](https://dev.windows.com/en-us/downloads/windows-10-sdk)/[macOS](https://developer.apple.com/opengl/))
|
||||
* Compiler such as [GCC 4.9+, Clang 3.4+](https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test), [MSVC12+](https://www.visualstudio.com/)
|
||||
|
||||
Note: On some operating systems such as Windows, manual steps are required to add cmake and [git](http://blog.countableset.ch/2012/06/07/adding-git-to-windows-7-path/) to your PATH environment variable.
|
||||
|
||||
### Manual compilation
|
||||
|
||||
```bash
|
||||
git clone --recursive https://github.com/mapbox/earcut.hpp.git
|
||||
cd earcut.hpp
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
# ./tests
|
||||
# ./bench
|
||||
# ./viz
|
||||
```
|
||||
|
||||
### [Visual Studio](https://www.visualstudio.com/), [Eclipse](https://eclipse.org/), [XCode](https://developer.apple.com/xcode/), ...
|
||||
|
||||
```batch
|
||||
git clone --recursive https://github.com/mapbox/earcut.hpp.git
|
||||
cd earcut.hpp
|
||||
mkdir project
|
||||
cd project
|
||||
cmake .. -G "Visual Studio 14 2015"
|
||||
::you can also generate projects for "Visual Studio 12 2013", "XCode", "Eclipse CDT4 - Unix Makefiles"
|
||||
```
|
||||
After completion, open the generated project with your IDE.
|
||||
|
||||
|
||||
### [CLion](https://www.jetbrains.com/clion/), [Visual Studio 2017+](https://www.visualstudio.com/)
|
||||
|
||||
Import the project from https://github.com/mapbox/earcut.hpp.git and you should be good to go!
|
||||
|
||||
## Status
|
||||
|
||||
This is currently based on [earcut 2.2.4](https://github.com/mapbox/earcut#224-jul-5-2022).
|
||||
814
deps_src/earcut/earcut.hpp
Normal file
|
|
@ -0,0 +1,814 @@
|
|||
#pragma once
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <limits>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace mapbox {
|
||||
|
||||
namespace util {
|
||||
|
||||
template <std::size_t I, typename T> struct nth {
|
||||
inline static typename std::tuple_element<I, T>::type
|
||||
get(const T& t) { return std::get<I>(t); };
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <typename N = uint32_t>
|
||||
class Earcut {
|
||||
public:
|
||||
std::vector<N> indices;
|
||||
std::size_t vertices = 0;
|
||||
|
||||
template <typename Polygon>
|
||||
void operator()(const Polygon& points);
|
||||
|
||||
private:
|
||||
struct Node {
|
||||
Node(N index, double x_, double y_) : i(index), x(x_), y(y_) {}
|
||||
Node(const Node&) = delete;
|
||||
Node& operator=(const Node&) = delete;
|
||||
Node(Node&&) = delete;
|
||||
Node& operator=(Node&&) = delete;
|
||||
|
||||
const N i;
|
||||
const double x;
|
||||
const double y;
|
||||
|
||||
// previous and next vertice nodes in a polygon ring
|
||||
Node* prev = nullptr;
|
||||
Node* next = nullptr;
|
||||
|
||||
// z-order curve value
|
||||
int32_t z = 0;
|
||||
|
||||
// previous and next nodes in z-order
|
||||
Node* prevZ = nullptr;
|
||||
Node* nextZ = nullptr;
|
||||
|
||||
// indicates whether this is a steiner point
|
||||
bool steiner = false;
|
||||
};
|
||||
|
||||
template <typename Ring> Node* linkedList(const Ring& points, const bool clockwise);
|
||||
Node* filterPoints(Node* start, Node* end = nullptr);
|
||||
void earcutLinked(Node* ear, int pass = 0);
|
||||
bool isEar(Node* ear);
|
||||
bool isEarHashed(Node* ear);
|
||||
Node* cureLocalIntersections(Node* start);
|
||||
void splitEarcut(Node* start);
|
||||
template <typename Polygon> Node* eliminateHoles(const Polygon& points, Node* outerNode);
|
||||
Node* eliminateHole(Node* hole, Node* outerNode);
|
||||
Node* findHoleBridge(Node* hole, Node* outerNode);
|
||||
bool sectorContainsSector(const Node* m, const Node* p);
|
||||
void indexCurve(Node* start);
|
||||
Node* sortLinked(Node* list);
|
||||
int32_t zOrder(const double x_, const double y_);
|
||||
Node* getLeftmost(Node* start);
|
||||
bool pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const;
|
||||
bool isValidDiagonal(Node* a, Node* b);
|
||||
double area(const Node* p, const Node* q, const Node* r) const;
|
||||
bool equals(const Node* p1, const Node* p2);
|
||||
bool intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2);
|
||||
bool onSegment(const Node* p, const Node* q, const Node* r);
|
||||
int sign(double val);
|
||||
bool intersectsPolygon(const Node* a, const Node* b);
|
||||
bool locallyInside(const Node* a, const Node* b);
|
||||
bool middleInside(const Node* a, const Node* b);
|
||||
Node* splitPolygon(Node* a, Node* b);
|
||||
template <typename Point> Node* insertNode(std::size_t i, const Point& p, Node* last);
|
||||
void removeNode(Node* p);
|
||||
|
||||
bool hashing;
|
||||
double minX, maxX;
|
||||
double minY, maxY;
|
||||
double inv_size = 0;
|
||||
|
||||
template <typename T, typename Alloc = std::allocator<T>>
|
||||
class ObjectPool {
|
||||
public:
|
||||
ObjectPool() { }
|
||||
ObjectPool(std::size_t blockSize_) {
|
||||
reset(blockSize_);
|
||||
}
|
||||
~ObjectPool() {
|
||||
clear();
|
||||
}
|
||||
template <typename... Args>
|
||||
T* construct(Args&&... args) {
|
||||
if (currentIndex >= blockSize) {
|
||||
currentBlock = alloc_traits::allocate(alloc, blockSize);
|
||||
allocations.emplace_back(currentBlock);
|
||||
currentIndex = 0;
|
||||
}
|
||||
T* object = ¤tBlock[currentIndex++];
|
||||
alloc_traits::construct(alloc, object, std::forward<Args>(args)...);
|
||||
return object;
|
||||
}
|
||||
void reset(std::size_t newBlockSize) {
|
||||
for (auto allocation : allocations) {
|
||||
alloc_traits::deallocate(alloc, allocation, blockSize);
|
||||
}
|
||||
allocations.clear();
|
||||
blockSize = std::max<std::size_t>(1, newBlockSize);
|
||||
currentBlock = nullptr;
|
||||
currentIndex = blockSize;
|
||||
}
|
||||
void clear() { reset(blockSize); }
|
||||
private:
|
||||
T* currentBlock = nullptr;
|
||||
std::size_t currentIndex = 1;
|
||||
std::size_t blockSize = 1;
|
||||
std::vector<T*> allocations;
|
||||
Alloc alloc;
|
||||
typedef typename std::allocator_traits<Alloc> alloc_traits;
|
||||
};
|
||||
ObjectPool<Node> nodes;
|
||||
};
|
||||
|
||||
template <typename N> template <typename Polygon>
|
||||
void Earcut<N>::operator()(const Polygon& points) {
|
||||
// reset
|
||||
indices.clear();
|
||||
vertices = 0;
|
||||
|
||||
if (points.empty()) return;
|
||||
|
||||
double x;
|
||||
double y;
|
||||
int threshold = 80;
|
||||
std::size_t len = 0;
|
||||
|
||||
for (size_t i = 0; threshold >= 0 && i < points.size(); i++) {
|
||||
threshold -= static_cast<int>(points[i].size());
|
||||
len += points[i].size();
|
||||
}
|
||||
|
||||
//estimate size of nodes and indices
|
||||
nodes.reset(len * 3 / 2);
|
||||
indices.reserve(len + points[0].size());
|
||||
|
||||
Node* outerNode = linkedList(points[0], true);
|
||||
if (!outerNode || outerNode->prev == outerNode->next) return;
|
||||
|
||||
if (points.size() > 1) outerNode = eliminateHoles(points, outerNode);
|
||||
|
||||
// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
|
||||
hashing = threshold < 0;
|
||||
if (hashing) {
|
||||
Node* p = outerNode->next;
|
||||
minX = maxX = outerNode->x;
|
||||
minY = maxY = outerNode->y;
|
||||
do {
|
||||
x = p->x;
|
||||
y = p->y;
|
||||
minX = std::min<double>(minX, x);
|
||||
minY = std::min<double>(minY, y);
|
||||
maxX = std::max<double>(maxX, x);
|
||||
maxY = std::max<double>(maxY, y);
|
||||
p = p->next;
|
||||
} while (p != outerNode);
|
||||
|
||||
// minX, minY and inv_size are later used to transform coords into integers for z-order calculation
|
||||
inv_size = std::max<double>(maxX - minX, maxY - minY);
|
||||
inv_size = inv_size != .0 ? (32767. / inv_size) : .0;
|
||||
}
|
||||
|
||||
earcutLinked(outerNode);
|
||||
|
||||
nodes.clear();
|
||||
}
|
||||
|
||||
// create a circular doubly linked list from polygon points in the specified winding order
|
||||
template <typename N> template <typename Ring>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::linkedList(const Ring& points, const bool clockwise) {
|
||||
using Point = typename Ring::value_type;
|
||||
double sum = 0;
|
||||
const std::size_t len = points.size();
|
||||
std::size_t i, j;
|
||||
Node* last = nullptr;
|
||||
|
||||
// calculate original winding order of a polygon ring
|
||||
for (i = 0, j = len > 0 ? len - 1 : 0; i < len; j = i++) {
|
||||
const auto& p1 = points[i];
|
||||
const auto& p2 = points[j];
|
||||
const double p20 = util::nth<0, Point>::get(p2);
|
||||
const double p10 = util::nth<0, Point>::get(p1);
|
||||
const double p11 = util::nth<1, Point>::get(p1);
|
||||
const double p21 = util::nth<1, Point>::get(p2);
|
||||
sum += (p20 - p10) * (p11 + p21);
|
||||
}
|
||||
|
||||
// link points into circular doubly-linked list in the specified winding order
|
||||
if (clockwise == (sum > 0)) {
|
||||
for (i = 0; i < len; i++) last = insertNode(vertices + i, points[i], last);
|
||||
} else {
|
||||
for (i = len; i-- > 0;) last = insertNode(vertices + i, points[i], last);
|
||||
}
|
||||
|
||||
if (last && equals(last, last->next)) {
|
||||
removeNode(last);
|
||||
last = last->next;
|
||||
}
|
||||
|
||||
vertices += len;
|
||||
|
||||
return last;
|
||||
}
|
||||
|
||||
// eliminate colinear or duplicate points
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::filterPoints(Node* start, Node* end) {
|
||||
if (!end) end = start;
|
||||
|
||||
Node* p = start;
|
||||
bool again;
|
||||
do {
|
||||
again = false;
|
||||
|
||||
if (!p->steiner && (equals(p, p->next) || area(p->prev, p, p->next) == 0)) {
|
||||
removeNode(p);
|
||||
p = end = p->prev;
|
||||
|
||||
if (p == p->next) break;
|
||||
again = true;
|
||||
|
||||
} else {
|
||||
p = p->next;
|
||||
}
|
||||
} while (again || p != end);
|
||||
|
||||
return end;
|
||||
}
|
||||
|
||||
// main ear slicing loop which triangulates a polygon (given as a linked list)
|
||||
template <typename N>
|
||||
void Earcut<N>::earcutLinked(Node* ear, int pass) {
|
||||
if (!ear) return;
|
||||
|
||||
// interlink polygon nodes in z-order
|
||||
if (!pass && hashing) indexCurve(ear);
|
||||
|
||||
Node* stop = ear;
|
||||
Node* prev;
|
||||
Node* next;
|
||||
|
||||
// iterate through ears, slicing them one by one
|
||||
while (ear->prev != ear->next) {
|
||||
prev = ear->prev;
|
||||
next = ear->next;
|
||||
|
||||
if (hashing ? isEarHashed(ear) : isEar(ear)) {
|
||||
// cut off the triangle
|
||||
indices.emplace_back(prev->i);
|
||||
indices.emplace_back(ear->i);
|
||||
indices.emplace_back(next->i);
|
||||
|
||||
removeNode(ear);
|
||||
|
||||
// skipping the next vertice leads to less sliver triangles
|
||||
ear = next->next;
|
||||
stop = next->next;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
ear = next;
|
||||
|
||||
// if we looped through the whole remaining polygon and can't find any more ears
|
||||
if (ear == stop) {
|
||||
// try filtering points and slicing again
|
||||
if (!pass) earcutLinked(filterPoints(ear), 1);
|
||||
|
||||
// if this didn't work, try curing all small self-intersections locally
|
||||
else if (pass == 1) {
|
||||
ear = cureLocalIntersections(filterPoints(ear));
|
||||
earcutLinked(ear, 2);
|
||||
|
||||
// as a last resort, try splitting the remaining polygon into two
|
||||
} else if (pass == 2) splitEarcut(ear);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check whether a polygon node forms a valid ear with adjacent nodes
|
||||
template <typename N>
|
||||
bool Earcut<N>::isEar(Node* ear) {
|
||||
const Node* a = ear->prev;
|
||||
const Node* b = ear;
|
||||
const Node* c = ear->next;
|
||||
|
||||
if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
||||
|
||||
// now make sure we don't have other points inside the potential ear
|
||||
Node* p = ear->next->next;
|
||||
|
||||
while (p != ear->prev) {
|
||||
if (pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) &&
|
||||
area(p->prev, p, p->next) >= 0) return false;
|
||||
p = p->next;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename N>
|
||||
bool Earcut<N>::isEarHashed(Node* ear) {
|
||||
const Node* a = ear->prev;
|
||||
const Node* b = ear;
|
||||
const Node* c = ear->next;
|
||||
|
||||
if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
||||
|
||||
// triangle bbox; min & max are calculated like this for speed
|
||||
const double minTX = std::min<double>(a->x, std::min<double>(b->x, c->x));
|
||||
const double minTY = std::min<double>(a->y, std::min<double>(b->y, c->y));
|
||||
const double maxTX = std::max<double>(a->x, std::max<double>(b->x, c->x));
|
||||
const double maxTY = std::max<double>(a->y, std::max<double>(b->y, c->y));
|
||||
|
||||
// z-order range for the current triangle bbox;
|
||||
const int32_t minZ = zOrder(minTX, minTY);
|
||||
const int32_t maxZ = zOrder(maxTX, maxTY);
|
||||
|
||||
// first look for points inside the triangle in increasing z-order
|
||||
Node* p = ear->nextZ;
|
||||
|
||||
while (p && p->z <= maxZ) {
|
||||
if (p != ear->prev && p != ear->next &&
|
||||
pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) &&
|
||||
area(p->prev, p, p->next) >= 0) return false;
|
||||
p = p->nextZ;
|
||||
}
|
||||
|
||||
// then look for points in decreasing z-order
|
||||
p = ear->prevZ;
|
||||
|
||||
while (p && p->z >= minZ) {
|
||||
if (p != ear->prev && p != ear->next &&
|
||||
pointInTriangle(a->x, a->y, b->x, b->y, c->x, c->y, p->x, p->y) &&
|
||||
area(p->prev, p, p->next) >= 0) return false;
|
||||
p = p->prevZ;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// go through all polygon nodes and cure small local self-intersections
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::cureLocalIntersections(Node* start) {
|
||||
Node* p = start;
|
||||
do {
|
||||
Node* a = p->prev;
|
||||
Node* b = p->next->next;
|
||||
|
||||
// a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2])
|
||||
if (!equals(a, b) && intersects(a, p, p->next, b) && locallyInside(a, b) && locallyInside(b, a)) {
|
||||
indices.emplace_back(a->i);
|
||||
indices.emplace_back(p->i);
|
||||
indices.emplace_back(b->i);
|
||||
|
||||
// remove two nodes involved
|
||||
removeNode(p);
|
||||
removeNode(p->next);
|
||||
|
||||
p = start = b;
|
||||
}
|
||||
p = p->next;
|
||||
} while (p != start);
|
||||
|
||||
return filterPoints(p);
|
||||
}
|
||||
|
||||
// try splitting polygon into two and triangulate them independently
|
||||
template <typename N>
|
||||
void Earcut<N>::splitEarcut(Node* start) {
|
||||
// look for a valid diagonal that divides the polygon into two
|
||||
Node* a = start;
|
||||
do {
|
||||
Node* b = a->next->next;
|
||||
while (b != a->prev) {
|
||||
if (a->i != b->i && isValidDiagonal(a, b)) {
|
||||
// split the polygon in two by the diagonal
|
||||
Node* c = splitPolygon(a, b);
|
||||
|
||||
// filter colinear points around the cuts
|
||||
a = filterPoints(a, a->next);
|
||||
c = filterPoints(c, c->next);
|
||||
|
||||
// run earcut on each half
|
||||
earcutLinked(a);
|
||||
earcutLinked(c);
|
||||
return;
|
||||
}
|
||||
b = b->next;
|
||||
}
|
||||
a = a->next;
|
||||
} while (a != start);
|
||||
}
|
||||
|
||||
// link every hole into the outer loop, producing a single-ring polygon without holes
|
||||
template <typename N> template <typename Polygon>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::eliminateHoles(const Polygon& points, Node* outerNode) {
|
||||
const size_t len = points.size();
|
||||
|
||||
std::vector<Node*> queue;
|
||||
for (size_t i = 1; i < len; i++) {
|
||||
Node* list = linkedList(points[i], false);
|
||||
if (list) {
|
||||
if (list == list->next) list->steiner = true;
|
||||
queue.push_back(getLeftmost(list));
|
||||
}
|
||||
}
|
||||
std::sort(queue.begin(), queue.end(), [](const Node* a, const Node* b) {
|
||||
return a->x < b->x;
|
||||
});
|
||||
|
||||
// process holes from left to right
|
||||
for (size_t i = 0; i < queue.size(); i++) {
|
||||
outerNode = eliminateHole(queue[i], outerNode);
|
||||
}
|
||||
|
||||
return outerNode;
|
||||
}
|
||||
|
||||
// find a bridge between vertices that connects hole with an outer ring and and link it
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::eliminateHole(Node* hole, Node* outerNode) {
|
||||
Node* bridge = findHoleBridge(hole, outerNode);
|
||||
if (!bridge) {
|
||||
return outerNode;
|
||||
}
|
||||
|
||||
Node* bridgeReverse = splitPolygon(bridge, hole);
|
||||
|
||||
// filter collinear points around the cuts
|
||||
filterPoints(bridgeReverse, bridgeReverse->next);
|
||||
|
||||
// Check if input node was removed by the filtering
|
||||
return filterPoints(bridge, bridge->next);
|
||||
}
|
||||
|
||||
// David Eberly's algorithm for finding a bridge between hole and outer polygon
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::findHoleBridge(Node* hole, Node* outerNode) {
|
||||
Node* p = outerNode;
|
||||
double hx = hole->x;
|
||||
double hy = hole->y;
|
||||
double qx = -std::numeric_limits<double>::infinity();
|
||||
Node* m = nullptr;
|
||||
|
||||
// find a segment intersected by a ray from the hole's leftmost Vertex to the left;
|
||||
// segment's endpoint with lesser x will be potential connection Vertex
|
||||
do {
|
||||
if (hy <= p->y && hy >= p->next->y && p->next->y != p->y) {
|
||||
double x = p->x + (hy - p->y) * (p->next->x - p->x) / (p->next->y - p->y);
|
||||
if (x <= hx && x > qx) {
|
||||
qx = x;
|
||||
m = p->x < p->next->x ? p : p->next;
|
||||
if (x == hx) return m; // hole touches outer segment; pick leftmost endpoint
|
||||
}
|
||||
}
|
||||
p = p->next;
|
||||
} while (p != outerNode);
|
||||
|
||||
if (!m) return 0;
|
||||
|
||||
// look for points inside the triangle of hole Vertex, segment intersection and endpoint;
|
||||
// if there are no points found, we have a valid connection;
|
||||
// otherwise choose the Vertex of the minimum angle with the ray as connection Vertex
|
||||
|
||||
const Node* stop = m;
|
||||
double tanMin = std::numeric_limits<double>::infinity();
|
||||
double tanCur = 0;
|
||||
|
||||
p = m;
|
||||
double mx = m->x;
|
||||
double my = m->y;
|
||||
|
||||
do {
|
||||
if (hx >= p->x && p->x >= mx && hx != p->x &&
|
||||
pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p->x, p->y)) {
|
||||
|
||||
tanCur = std::abs(hy - p->y) / (hx - p->x); // tangential
|
||||
|
||||
if (locallyInside(p, hole) &&
|
||||
(tanCur < tanMin || (tanCur == tanMin && (p->x > m->x || sectorContainsSector(m, p))))) {
|
||||
m = p;
|
||||
tanMin = tanCur;
|
||||
}
|
||||
}
|
||||
|
||||
p = p->next;
|
||||
} while (p != stop);
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
// whether sector in vertex m contains sector in vertex p in the same coordinates
|
||||
template <typename N>
|
||||
bool Earcut<N>::sectorContainsSector(const Node* m, const Node* p) {
|
||||
return area(m->prev, m, p->prev) < 0 && area(p->next, m, m->next) < 0;
|
||||
}
|
||||
|
||||
// interlink polygon nodes in z-order
|
||||
template <typename N>
|
||||
void Earcut<N>::indexCurve(Node* start) {
|
||||
assert(start);
|
||||
Node* p = start;
|
||||
|
||||
do {
|
||||
p->z = p->z ? p->z : zOrder(p->x, p->y);
|
||||
p->prevZ = p->prev;
|
||||
p->nextZ = p->next;
|
||||
p = p->next;
|
||||
} while (p != start);
|
||||
|
||||
p->prevZ->nextZ = nullptr;
|
||||
p->prevZ = nullptr;
|
||||
|
||||
sortLinked(p);
|
||||
}
|
||||
|
||||
// Simon Tatham's linked list merge sort algorithm
|
||||
// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::sortLinked(Node* list) {
|
||||
assert(list);
|
||||
Node* p;
|
||||
Node* q;
|
||||
Node* e;
|
||||
Node* tail;
|
||||
int i, numMerges, pSize, qSize;
|
||||
int inSize = 1;
|
||||
|
||||
for (;;) {
|
||||
p = list;
|
||||
list = nullptr;
|
||||
tail = nullptr;
|
||||
numMerges = 0;
|
||||
|
||||
while (p) {
|
||||
numMerges++;
|
||||
q = p;
|
||||
pSize = 0;
|
||||
for (i = 0; i < inSize; i++) {
|
||||
pSize++;
|
||||
q = q->nextZ;
|
||||
if (!q) break;
|
||||
}
|
||||
|
||||
qSize = inSize;
|
||||
|
||||
while (pSize > 0 || (qSize > 0 && q)) {
|
||||
|
||||
if (pSize == 0) {
|
||||
e = q;
|
||||
q = q->nextZ;
|
||||
qSize--;
|
||||
} else if (qSize == 0 || !q) {
|
||||
e = p;
|
||||
p = p->nextZ;
|
||||
pSize--;
|
||||
} else if (p->z <= q->z) {
|
||||
e = p;
|
||||
p = p->nextZ;
|
||||
pSize--;
|
||||
} else {
|
||||
e = q;
|
||||
q = q->nextZ;
|
||||
qSize--;
|
||||
}
|
||||
|
||||
if (tail) tail->nextZ = e;
|
||||
else list = e;
|
||||
|
||||
e->prevZ = tail;
|
||||
tail = e;
|
||||
}
|
||||
|
||||
p = q;
|
||||
}
|
||||
|
||||
tail->nextZ = nullptr;
|
||||
|
||||
if (numMerges <= 1) return list;
|
||||
|
||||
inSize *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
// z-order of a Vertex given coords and size of the data bounding box
|
||||
template <typename N>
|
||||
int32_t Earcut<N>::zOrder(const double x_, const double y_) {
|
||||
// coords are transformed into non-negative 15-bit integer range
|
||||
int32_t x = static_cast<int32_t>((x_ - minX) * inv_size);
|
||||
int32_t y = static_cast<int32_t>((y_ - minY) * inv_size);
|
||||
|
||||
x = (x | (x << 8)) & 0x00FF00FF;
|
||||
x = (x | (x << 4)) & 0x0F0F0F0F;
|
||||
x = (x | (x << 2)) & 0x33333333;
|
||||
x = (x | (x << 1)) & 0x55555555;
|
||||
|
||||
y = (y | (y << 8)) & 0x00FF00FF;
|
||||
y = (y | (y << 4)) & 0x0F0F0F0F;
|
||||
y = (y | (y << 2)) & 0x33333333;
|
||||
y = (y | (y << 1)) & 0x55555555;
|
||||
|
||||
return x | (y << 1);
|
||||
}
|
||||
|
||||
// find the leftmost node of a polygon ring
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::getLeftmost(Node* start) {
|
||||
Node* p = start;
|
||||
Node* leftmost = start;
|
||||
do {
|
||||
if (p->x < leftmost->x || (p->x == leftmost->x && p->y < leftmost->y))
|
||||
leftmost = p;
|
||||
p = p->next;
|
||||
} while (p != start);
|
||||
|
||||
return leftmost;
|
||||
}
|
||||
|
||||
// check if a point lies within a convex triangle
|
||||
template <typename N>
|
||||
bool Earcut<N>::pointInTriangle(double ax, double ay, double bx, double by, double cx, double cy, double px, double py) const {
|
||||
return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&
|
||||
(ax - px) * (by - py) >= (bx - px) * (ay - py) &&
|
||||
(bx - px) * (cy - py) >= (cx - px) * (by - py);
|
||||
}
|
||||
|
||||
// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
|
||||
template <typename N>
|
||||
bool Earcut<N>::isValidDiagonal(Node* a, Node* b) {
|
||||
return a->next->i != b->i && a->prev->i != b->i && !intersectsPolygon(a, b) && // dones't intersect other edges
|
||||
((locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
|
||||
(area(a->prev, a, b->prev) != 0.0 || area(a, b->prev, b) != 0.0)) || // does not create opposite-facing sectors
|
||||
(equals(a, b) && area(a->prev, a, a->next) > 0 && area(b->prev, b, b->next) > 0)); // special zero-length case
|
||||
}
|
||||
|
||||
// signed area of a triangle
|
||||
template <typename N>
|
||||
double Earcut<N>::area(const Node* p, const Node* q, const Node* r) const {
|
||||
return (q->y - p->y) * (r->x - q->x) - (q->x - p->x) * (r->y - q->y);
|
||||
}
|
||||
|
||||
// check if two points are equal
|
||||
template <typename N>
|
||||
bool Earcut<N>::equals(const Node* p1, const Node* p2) {
|
||||
return p1->x == p2->x && p1->y == p2->y;
|
||||
}
|
||||
|
||||
// check if two segments intersect
|
||||
template <typename N>
|
||||
bool Earcut<N>::intersects(const Node* p1, const Node* q1, const Node* p2, const Node* q2) {
|
||||
int o1 = sign(area(p1, q1, p2));
|
||||
int o2 = sign(area(p1, q1, q2));
|
||||
int o3 = sign(area(p2, q2, p1));
|
||||
int o4 = sign(area(p2, q2, q1));
|
||||
|
||||
if (o1 != o2 && o3 != o4) return true; // general case
|
||||
|
||||
if (o1 == 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
|
||||
if (o2 == 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
|
||||
if (o3 == 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
|
||||
if (o4 == 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// for collinear points p, q, r, check if point q lies on segment pr
|
||||
template <typename N>
|
||||
bool Earcut<N>::onSegment(const Node* p, const Node* q, const Node* r) {
|
||||
return q->x <= std::max<double>(p->x, r->x) &&
|
||||
q->x >= std::min<double>(p->x, r->x) &&
|
||||
q->y <= std::max<double>(p->y, r->y) &&
|
||||
q->y >= std::min<double>(p->y, r->y);
|
||||
}
|
||||
|
||||
template <typename N>
|
||||
int Earcut<N>::sign(double val) {
|
||||
return (0.0 < val) - (val < 0.0);
|
||||
}
|
||||
|
||||
// check if a polygon diagonal intersects any polygon segments
|
||||
template <typename N>
|
||||
bool Earcut<N>::intersectsPolygon(const Node* a, const Node* b) {
|
||||
const Node* p = a;
|
||||
do {
|
||||
if (p->i != a->i && p->next->i != a->i && p->i != b->i && p->next->i != b->i &&
|
||||
intersects(p, p->next, a, b)) return true;
|
||||
p = p->next;
|
||||
} while (p != a);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// check if a polygon diagonal is locally inside the polygon
|
||||
template <typename N>
|
||||
bool Earcut<N>::locallyInside(const Node* a, const Node* b) {
|
||||
return area(a->prev, a, a->next) < 0 ?
|
||||
area(a, b, a->next) >= 0 && area(a, a->prev, b) >= 0 :
|
||||
area(a, b, a->prev) < 0 || area(a, a->next, b) < 0;
|
||||
}
|
||||
|
||||
// check if the middle Vertex of a polygon diagonal is inside the polygon
|
||||
template <typename N>
|
||||
bool Earcut<N>::middleInside(const Node* a, const Node* b) {
|
||||
const Node* p = a;
|
||||
bool inside = false;
|
||||
double px = (a->x + b->x) / 2;
|
||||
double py = (a->y + b->y) / 2;
|
||||
do {
|
||||
if (((p->y > py) != (p->next->y > py)) && p->next->y != p->y &&
|
||||
(px < (p->next->x - p->x) * (py - p->y) / (p->next->y - p->y) + p->x))
|
||||
inside = !inside;
|
||||
p = p->next;
|
||||
} while (p != a);
|
||||
|
||||
return inside;
|
||||
}
|
||||
|
||||
// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits
|
||||
// polygon into two; if one belongs to the outer ring and another to a hole, it merges it into a
|
||||
// single ring
|
||||
template <typename N>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::splitPolygon(Node* a, Node* b) {
|
||||
Node* a2 = nodes.construct(a->i, a->x, a->y);
|
||||
Node* b2 = nodes.construct(b->i, b->x, b->y);
|
||||
Node* an = a->next;
|
||||
Node* bp = b->prev;
|
||||
|
||||
a->next = b;
|
||||
b->prev = a;
|
||||
|
||||
a2->next = an;
|
||||
an->prev = a2;
|
||||
|
||||
b2->next = a2;
|
||||
a2->prev = b2;
|
||||
|
||||
bp->next = b2;
|
||||
b2->prev = bp;
|
||||
|
||||
return b2;
|
||||
}
|
||||
|
||||
// create a node and util::optionally link it with previous one (in a circular doubly linked list)
|
||||
template <typename N> template <typename Point>
|
||||
typename Earcut<N>::Node*
|
||||
Earcut<N>::insertNode(std::size_t i, const Point& pt, Node* last) {
|
||||
Node* p = nodes.construct(static_cast<N>(i), util::nth<0, Point>::get(pt), util::nth<1, Point>::get(pt));
|
||||
|
||||
if (!last) {
|
||||
p->prev = p;
|
||||
p->next = p;
|
||||
|
||||
} else {
|
||||
assert(last);
|
||||
p->next = last->next;
|
||||
p->prev = last;
|
||||
last->next->prev = p;
|
||||
last->next = p;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
template <typename N>
|
||||
void Earcut<N>::removeNode(Node* p) {
|
||||
p->next->prev = p->prev;
|
||||
p->prev->next = p->next;
|
||||
|
||||
if (p->prevZ) p->prevZ->nextZ = p->nextZ;
|
||||
if (p->nextZ) p->nextZ->prevZ = p->prevZ;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename N = uint32_t, typename Polygon>
|
||||
std::vector<N> earcut(const Polygon& poly) {
|
||||
mapbox::detail::Earcut<N> earcut;
|
||||
earcut(poly);
|
||||
return std::move(earcut.indices);
|
||||
}
|
||||
}
|
||||
|
|
@ -228,5 +228,7 @@ namespace ImGui
|
|||
const wchar_t OpenHoverDarkButton = 0x085B;
|
||||
|
||||
// void MyFunction(const char* name, const MyMatrix44& v);
|
||||
|
||||
const wchar_t FilamentGreen = 0x0850;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4415,7 +4415,7 @@ bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputT
|
|||
|
||||
bool ImGui::InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
|
||||
{
|
||||
return InputTextEx(label, NULL, buf, (int)buf_size, size, flags | ImGuiInputTextFlags_Multiline, callback, user_data);
|
||||
return InputTextEx(label, NULL, buf, (int) buf_size, size, flags , callback, user_data);//ImGuiInputTextFlags_Multiline should manual input
|
||||
}
|
||||
|
||||
bool ImGui::InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
|
||||
|
|
|
|||
|
|
@ -2,69 +2,132 @@
|
|||
|
||||
Cornering is a critical aspect of 3D printing that affects print quality and accuracy. It's how the printer handles changes in direction during movement, particularly at corners and curves. Proper cornering settings can reduce artifacts such as ringing, ghosting, and overshooting, resulting in cleaner and more precise prints.
|
||||
|
||||
## Jerk
|
||||
## Types of Cornering Settings
|
||||
|
||||
TODO: Jerk calibration not implemented yet.
|
||||
> [!TIP]
|
||||
> Read more in [Jerk XY](speed_settings_jerk_xy) and check [Cornering Control Types](speed_settings_jerk_xy#cornering-control-types)
|
||||
|
||||
## Junction Deviation
|
||||
## Calibration
|
||||
|
||||
Junction Deviation is the default method for controlling cornering speed in **Marlin firmware (Marlin 2.x)**.
|
||||
Higher values allow more aggressive cornering, while lower values produce smoother, more controlled corners.
|
||||
The default value in Marlin is often `0.08mm`, which may be too high for some printers and may cause ringing. Consider lowering this value to reduce ringing, but avoid setting it too low that could lead to excessively slow cornering speed.
|
||||
This test will be set detect automatically your printer firmware type and will adapt to the specific calibration process.
|
||||
|
||||
```math
|
||||
JD = 0.4 \cdot \frac{\text{Jerk}^2}{\text{Acceleration}}
|
||||
```
|
||||
- Klipper: [square_corner_velocity](https://www.klipper3d.org/Config_Reference.html#printer)
|
||||
- Marlin 2:
|
||||
- [Junction Deviation](https://marlinfw.org/docs/configuration/configuration.html#junction-deviation-) if `Maximum Junction Deviation` in Printer settings/Motion ability/Jerk limitations is bigger than `0`.
|
||||
- [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-) if `Maximum Junction Deviation` is set to `0`.
|
||||
- Marlin Legacy: [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-).
|
||||
- RepRap: [Maximum instantaneous speed changes](https://docs.duet3d.com/User_manual/Reference/Gcodes#m566-set-allowable-instantaneous-speed-change)
|
||||
|
||||
> [!NOTE]
|
||||
> This calibration example uses Junction Deviation as an example. The process is similar for Jerk calibration; just read the Jerk values instead of JD values.
|
||||
> JD values are between `0.0` and `0.3` (in mm) while Jerk values are usually between `1` and `20` or higher (in mm/s).
|
||||
|
||||
1. Pre-requisites:
|
||||
1. Check if your printer has Junction Deviation enabled. Look for `Junction deviation` in the printer's advanced settings.
|
||||
1. If using Marlin 2 firmware, Check if your printer has Junction Deviation enabled. Look for `Junction deviation` in the printer's advanced settings.
|
||||
2. In OrcaSlicer, set:
|
||||
1. Acceleration high enough to trigger ringing (e.g., 2000 mm/s²).
|
||||
1. Acceleration high enough to trigger ringing or the speed you want to check out (e.g., 2000 mm/s²).
|
||||
2. Speed high enough to trigger ringing (e.g., 100 mm/s).
|
||||
3. Use an opaque, high-gloss filament to make ringing more visible.
|
||||
2. You need to print the Junction Deviation test.
|
||||
2. Open the Cornering test.
|
||||

|
||||
1. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer.
|
||||
1. In this first approximation, set a wide range of Start and End values.
|
||||
- If you don't see any loss of quality, increase the End value and retry.
|
||||
- If you do see a loss of quality, measure the maximum height when the corners start losing sharpness and read the Cornering/Jerk/JunctionDeviation value set at that point in OrcaSlicer.
|
||||

|
||||

|
||||
2. You will likely need values lower than `0.08mm`, as in the example. To find a better maximum JD value, print a new calibration tower with a maximum set near the point where corners start losing sharpness.
|
||||
3. Print the second Junction Deviation test with the new maximum value.
|
||||
2. Print a new calibration tower with a maximum set near the point where corners start losing sharpness.
|
||||
**RECOMMENDED:** Use the *Ringing Tower* test model to more easily visualize the jerk limit.
|
||||
3. Print the second Cornering test with the new maximum value.
|
||||

|
||||
4. Measure the X and Y heights and read the frequency set at that point in OrcaSlicer.
|
||||
4. Measure the maximum height when the corners start losing sharpness and read the Cornering/Jerk/JunctionDeviation value set at that point in OrcaSlicer.
|
||||

|
||||

|
||||
3. Save the settings
|
||||
1. Set your Maximum Junction Deviation value in [Printer settings/Motion ability/Jerk limitation].
|
||||

|
||||
2. Use the following G-code to set the value:
|
||||
- Into your OrcaSlicer printer profile (**RECOMMENDED**):
|
||||
1. Go to Printer settings → Motion ability → Jerk limitation:
|
||||
2. Set your maximum Jerk X and Y or Junction Deviation values.
|
||||

|
||||
- Directly into your printer firmware:
|
||||
- Restore your 3D Printer settings to avoid keeping high acceleration and jerk values used for the test.
|
||||
|
||||
```gcode
|
||||
M205 J#JunctionDeviationValue
|
||||
M500
|
||||
```
|
||||
- Klipper:
|
||||
- Skeleton
|
||||
|
||||
Example
|
||||
```gcode
|
||||
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=#SquareCornerVelocity
|
||||
```
|
||||
|
||||
```gcode
|
||||
M205 J0.012
|
||||
M500
|
||||
```
|
||||
Example:
|
||||
|
||||
3. Recompile your MarlinFW
|
||||
1. In Configuration.h uncomment and set:
|
||||
```gcode
|
||||
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=5.0
|
||||
```
|
||||
|
||||
```cpp
|
||||
#define JUNCTION_DEVIATION_MM 0.012 // (mm) Distance from real junction edge
|
||||
```
|
||||
Note: You can also set `square_corner_velocity` persistently in your `printer.cfg` (restart required).
|
||||
|
||||
2. Ensure Classic Jerk is disabled (commented out):
|
||||
- Marlin 2 (Junction Deviation enabled):
|
||||
- Skeleton
|
||||
|
||||
```cpp
|
||||
//#define CLASSIC_JERK
|
||||
```
|
||||
```gcode
|
||||
M205 J#JunctionDeviationValue
|
||||
M500
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```gcode
|
||||
M205 J0.012
|
||||
M500
|
||||
```
|
||||
|
||||
- To make the change permanent in firmware, set in `Configuration.h` and recompile:
|
||||
|
||||
```cpp
|
||||
#define JUNCTION_DEVIATION_MM 0.012 // (mm) Distance from real junction edge
|
||||
```
|
||||
|
||||
Also ensure classic jerk is disabled if using junction deviation:
|
||||
|
||||
```cpp
|
||||
//#define CLASSIC_JERK
|
||||
```
|
||||
|
||||
- Marlin Classic Jerk / Marlin Legacy:
|
||||
- Skeleton — set the per-axis jerk limits using `M205` (X/Y optional depending on firmware build):
|
||||
|
||||
```gcode
|
||||
M205 X#JerkX Y#JerkY
|
||||
M500
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```gcode
|
||||
M205 X10 Y10
|
||||
M500
|
||||
```
|
||||
|
||||
- RepRap (Duet / RepRapFirmware):
|
||||
**IMPORTANT:** Set in mm/min so convert from mm/s to mm/min multiply by 60.
|
||||
- Skeleton
|
||||
|
||||
```gcode
|
||||
M566 X#max_instantaneous_change Y#max_instantaneous_change
|
||||
M500 ; if supported by your board
|
||||
```
|
||||
|
||||
Example (Duet-style):
|
||||
|
||||
```gcode
|
||||
M566 X3000 Y3000
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> RepRapFirmware exposes `M566` to set allowable instantaneous speed changes; some boards may persist settings with `M500` or via their web/config files.
|
||||
|
||||
## Credits
|
||||
|
||||
- **Junction Deviation Machine Limit** [@RF47](https://github.com/RF47)
|
||||
- **Junction Deviation Calibration** [@IanAlexis](https://github.com/IanAlexis)
|
||||
- **Cornering Calibration** [@IanAlexis](https://github.com/IanAlexis)
|
||||
- **Fast tower model** [@RF47](https://github.com/RF47)
|
||||
- **SCV-V2 model** [@chrisheib](https://www.thingiverse.com/chrisheib)
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 4.7 KiB |
|
|
@ -30,7 +30,8 @@ Fallback value used when a specific line width is not set (set to `0`).
|
|||
|
||||
### First Layer
|
||||
|
||||
A wider first layer (with a higher [first layer height](quality_settings_layer_height#first-layer-height)) improves bed adhesion and compensates for uneven build surfaces.
|
||||
A wider first layer (with a higher [first layer height](quality_settings_layer_height#first-layer-height)) improves bed adhesion and compensates for uneven build surfaces.
|
||||
First layer line width also overrides [Brim's](others_settings_brim) and [Skirt's](others_settings_skirt) line width.
|
||||
|
||||
### Outer Wall
|
||||
|
||||
|
|
|
|||
|
|
@ -61,6 +61,33 @@ To mitigate this effect, OrcaSlicer allows you to specify a negative distance th
|
|||
|
||||

|
||||
|
||||
The compensation works as follows:
|
||||
When the `current_layer` is <= `input_compensation_layers`
|
||||
```c++
|
||||
compensation = input_compensation_distance - (input_compensation_distance / input_compensation_layers) × (current_layer - 1)
|
||||
```
|
||||
According to the equation, we can establish the following rules:
|
||||
- In the 1st layer, since it is layer `1 - 1 = 0`, compensation is 100%.
|
||||
- The intermediate layers (between the first and input_compensation_layers) will have linear compensation.
|
||||
- Layers above the specified amount will not be compensated.
|
||||
|
||||
Assuming the compensation value is 0.25 mm:
|
||||
|
||||
- Elephant Foot Compensation Layers = 1 :
|
||||
- 1st layer: `0.25mm` compensation (100%)
|
||||
- 2nd layer and beyond: No compensation (0 mm)
|
||||
- Elephant Foot Compensation Layers = 2 :
|
||||
- 1st layer: `0.25mm` compensation (100%)
|
||||
- 2nd layer: `0.25 − (0.25 / 2) × (2 - 1) = 0.125mm` compensation (50%)
|
||||
- 3rd layer and beyond: No compensation (0 mm).
|
||||
- Elephant Foot Compensation Layers = 5 :
|
||||
- 1st layer: `0.25mm` compensation (100%)
|
||||
- 2nd layer: `0.25 − (0.25 / 5) × (2 - 1) = 0.2mm` compensation (80%)
|
||||
- 3rd layer: `0.25 − (0.25 / 5) × (3 - 1) = 0.15mm` compensation (60%)
|
||||
- 4th layer: `0.25 − (0.25 / 5) × (4 - 1) = 0.1mm` compensation (40%)
|
||||
- 5th layer: `0.25 − (0.25 / 5) × (5 - 1) = 0.05mm` compensation (20%)
|
||||
- 6th layer and beyond: No compensation (0 mm).
|
||||
|
||||
## Precise wall
|
||||
|
||||
The 'Precise Wall' is a distinctive feature introduced by OrcaSlicer, aimed at improving the dimensional accuracy of prints and minimizing layer inconsistencies by slightly increasing the spacing between the outer wall and the inner wall when printing in [Inner Outer wall order](quality_settings_wall_and_surfaces#innerouter).
|
||||
|
|
|
|||
|
|
@ -5,8 +5,15 @@
|
|||
## Cornering Control Types
|
||||
|
||||
- **Jerk**: Traditional method, sets a maximum speed for direction changes.
|
||||
- Klipper: [Square corner velocity](https://www.klipper3d.org/Config_Reference.html#printer)
|
||||
- RepRapFirmware: [Maximum instantaneous speed changes](https://docs.duet3d.com/User_manual/Reference/Gcodes#m566-set-allowable-instantaneous-speed-change)
|
||||
- Marlin 2: [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-) (deprecated in favor of [Junction Deviation](https://marlinfw.org/docs/configuration/configuration.html#junction-deviation-)) but can still be used.
|
||||
- Marlin Legacy: [Classic Jerk](https://marlinfw.org/docs/configuration/configuration.html#jerk-).
|
||||
- **[Junction Deviation](#junction-deviation)**: Modern method, calculates cornering speed based on acceleration and speed.
|
||||
|
||||
> [!TIP]
|
||||
> Calibrate your Cornering Values using the [Cornering Calibration guide](cornering-calib).
|
||||
|
||||
## Key Effects
|
||||
|
||||
- **Corner Control**: Lower values = smoother corners, better quality. Higher values = faster cornering, potential artifacts
|
||||
|
|
@ -16,7 +23,7 @@
|
|||
This setting overrides firmware jerk values when different motion types need specific settings. Orca limits jerk to not exceed the Printer's Motion Ability settings.
|
||||
|
||||
> [!TIP]
|
||||
> Jerk can work in conjunction with [Pressure Advance](pressure-advance-calib), [Adaptive Pressure Advance](adaptive-pressure-advance-calib), and [Input Shaping](input-shaping-calib) to optimize print quality and speed.
|
||||
> Jerk can work in conjunction with [Pressure Advance](pressure-advance-calib), [Adaptive Pressure Advance](adaptive-pressure-advance-calib), and [Input Shaping](input-shaping-calib) to optimize print quality and speed.
|
||||
> It's recommended to follow the [calibration guide](calibration) order for best results.
|
||||
|
||||
- [Cornering Control Types](#cornering-control-types)
|
||||
|
|
@ -64,12 +71,14 @@ Jerk for travel printing. This is usually set to a higher value than infill to r
|
|||
|
||||
## Junction Deviation
|
||||
|
||||
Alternative to Jerk, Junction Deviation is the default method for controlling cornering speed in MarlinFW (Marlin2) printers.
|
||||
Alternative to Jerk, Junction Deviation is the default method for controlling cornering speed in Marlin 2 printers.
|
||||
Higher values result in more aggressive cornering speeds, while lower values produce smoother, more controlled cornering.
|
||||
|
||||
This value will **only be overwritten** if it is lower than the Junction Deviation value set in Printer settings > Motion ability. If it is higher, the value configured in Motion ability will be used.
|
||||
> [!NOTE]
|
||||
> Classic Jerk can still be used in Marlin 2, but it is deprecated in favor of Junction Deviation.
|
||||
> If your printer uses Classic Jerk, you need to set your Junction Deviation to `0` to enable the use of Classic Jerk.
|
||||
|
||||
To Calculate your Junction Deviation value, please refer to the [Junction Deviation Calibration guide](cornering-calib#junction-deviation).
|
||||
This value will **only be overwritten** if it is lower than the Junction Deviation value set in Printer settings > Motion ability. If it is higher, the value configured in Motion ability will be used.
|
||||
|
||||
```math
|
||||
JD = 0,4 \cdot \frac{\text{Jerk}^2}{\text{Accel.}}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ Support structures are used in 3D printing to provide stability to overhangs and
|
|||
- [Initial layer density](#initial-layer-density)
|
||||
- [Initial layer expansion](#initial-layer-expansion)
|
||||
- [On build plate only](#on-build-plate-only)
|
||||
- [Remove small overhangs](#remove-small-overhangs)
|
||||
- [Ignore small overhangs](#ignore-small-overhangs)
|
||||
|
||||
## Type
|
||||
|
||||
|
|
@ -95,6 +95,6 @@ Expand the first raft or support layer to improve bed plate adhesion.
|
|||
|
||||
Don't create support on model surface, only on build plate.
|
||||
|
||||
## Remove small overhangs
|
||||
## Ignore small overhangs
|
||||
|
||||
Remove small overhangs that possibly need no supports.
|
||||
With this setting small overhangs that possibly need no supports will be ignored from support generation.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,47 @@
|
|||
src/libslic3r/PresetBundle.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevBed.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevBed.h
|
||||
src/slic3r/GUI/DeviceCore/DevConfig.h
|
||||
src/slic3r/GUI/DeviceCore/DevConfig.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevConfigUtil.h
|
||||
src/slic3r/GUI/DeviceCore/DevConfigUtil.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevCtrl.h
|
||||
src/slic3r/GUI/DeviceCore/DevCtrl.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevDefs.h
|
||||
src/slic3r/GUI/DeviceCore/DevExtruderSystem.h
|
||||
src/slic3r/GUI/DeviceCore/DevExtruderSystem.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevExtruderSystemCtrl.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFan.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFan.h
|
||||
src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h
|
||||
src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFilaBlackList.h
|
||||
src/slic3r/GUI/DeviceCore/DevFilaBlackList.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFilaSystem.h
|
||||
src/slic3r/GUI/DeviceCore/DevFilaSystem.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevFirmware.h
|
||||
src/slic3r/GUI/DeviceCore/DevFirmware.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevPrintOptions.h
|
||||
src/slic3r/GUI/DeviceCore/DevPrintOptions.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.h
|
||||
src/slic3r/GUI/DeviceCore/DevPrintTaskInfo.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevHMS.h
|
||||
src/slic3r/GUI/DeviceCore/DevHMS.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevStorage.h
|
||||
src/slic3r/GUI/DeviceCore/DevStorage.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevInfo.h
|
||||
src/slic3r/GUI/DeviceCore/DevInfo.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevLamp.h
|
||||
src/slic3r/GUI/DeviceCore/DevLamp.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevLampCtrl.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevManager.h
|
||||
src/slic3r/GUI/DeviceCore/DevManager.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevMapping.h
|
||||
src/slic3r/GUI/DeviceCore/DevMapping.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevNozzleSystem.h
|
||||
src/slic3r/GUI/DeviceCore/DevNozzleSystem.cpp
|
||||
src/slic3r/GUI/DeviceCore/DevUtil.h
|
||||
src/slic3r/GUI/DeviceCore/DevUtil.cpp
|
||||
src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.h
|
||||
src/slic3r/GUI/DeviceTab/uiAmsHumidityPopup.cpp
|
||||
src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h
|
||||
|
|
@ -5,6 +49,7 @@ src/slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.cpp
|
|||
src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoFuzzySkin.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoScale.cpp
|
||||
|
|
@ -38,6 +83,9 @@ src/slic3r/GUI/HintNotification.cpp
|
|||
src/slic3r/GUI/IMSlider.cpp
|
||||
src/slic3r/GUI/Widgets/SideTools.cpp
|
||||
src/slic3r/GUI/Widgets/AMSControl.cpp
|
||||
src/slic3r/GUI/Widgets/FanControl.cpp
|
||||
src/slic3r/GUI/Widgets/FilamentLoad.cpp
|
||||
src/slic3r/GUI/Widgets/TempInput.cpp
|
||||
src/slic3r/GUI/ImGuiWrapper.cpp
|
||||
src/slic3r/GUI/Jobs/ArrangeJob.cpp
|
||||
src/slic3r/GUI/Jobs/OrientJob.cpp
|
||||
|
|
@ -57,15 +105,11 @@ src/slic3r/GUI/BBLTopbar.cpp
|
|||
src/slic3r/GUI/DownloadProgressDialog.cpp
|
||||
src/slic3r/GUI/RecenterDialog.cpp
|
||||
src/slic3r/GUI/BackgroundSlicingProcess.cpp
|
||||
src/slic3r/GUI/MultiMachinePage.cpp
|
||||
src/slic3r/GUI/MultiMachineManagerPage.cpp
|
||||
src/slic3r/GUI/MultiMachine.cpp
|
||||
src/slic3r/GUI/MultiTaskManagerPage.cpp
|
||||
src/slic3r/GUI/SendMultiMachinePage.cpp
|
||||
src/slic3r/GUI/BedShapeDialog.cpp
|
||||
src/slic3r/GUI/BedShapeDialog.hpp
|
||||
src/slic3r/GUI/ConfigManipulation.cpp
|
||||
src/slic3r/GUI/DeviceManager.cpp
|
||||
src/slic3r/GUI/DeviceErrorDialog.cpp
|
||||
src/slic3r/GUI/ExtraRenderers.cpp
|
||||
src/slic3r/GUI/EditGCodeDialog.cpp
|
||||
src/slic3r/GUI/Field.cpp
|
||||
|
|
@ -79,8 +123,10 @@ src/slic3r/GUI/MainFrame.cpp
|
|||
src/slic3r/GUI/MediaPlayCtrl.cpp
|
||||
src/slic3r/GUI/MediaFilePanel.cpp
|
||||
src/slic3r/GUI/ImageGrid.cpp
|
||||
src/slic3r/GUI/Widgets/ImageSwitchButton.cpp
|
||||
src/slic3r/GUI/Printer/PrinterFileSystem.cpp
|
||||
src/slic3r/GUI/Mouse3DController.cpp
|
||||
src/slic3r/GUI/SelectMachinePop.cpp
|
||||
src/slic3r/GUI/StatusPanel.cpp
|
||||
src/slic3r/GUI/Monitor.cpp
|
||||
src/slic3r/GUI/MsgDialog.cpp
|
||||
|
|
@ -104,6 +150,7 @@ src/slic3r/GUI/SavePresetDialog.cpp
|
|||
src/slic3r/GUI/Search.cpp
|
||||
src/slic3r/GUI/Selection.cpp
|
||||
src/slic3r/GUI/SelectMachine.cpp
|
||||
src/slic3r/GUI/PrePrintChecker.cpp
|
||||
src/slic3r/GUI/SendSystemInfoDialog.cpp
|
||||
src/slic3r/GUI/SendToPrinter.cpp
|
||||
src/slic3r/GUI/SlicingProgressNotification.cpp
|
||||
|
|
@ -115,6 +162,7 @@ src/slic3r/GUI/Auxiliary.cpp
|
|||
src/slic3r/GUI/UpdateDialogs.cpp
|
||||
src/slic3r/GUI/UnsavedChangesDialog.cpp
|
||||
src/slic3r/GUI/ObjColorDialog.cpp
|
||||
src/slic3r/GUI/SyncAmsInfoDialog.cpp
|
||||
src/slic3r/GUI/WipeTowerDialog.cpp
|
||||
src/slic3r/GUI/wxExtensions.cpp
|
||||
src/slic3r/GUI/wxMediaCtrl2.cpp
|
||||
|
|
@ -132,6 +180,7 @@ src/slic3r/Utils/Http.cpp
|
|||
src/slic3r/Utils/Process.cpp
|
||||
src/slic3r/GUI/Jobs/PrintJob.cpp
|
||||
src/libslic3r/GCode.cpp
|
||||
src/libslic3r/GCode/ToolOrdering.cpp
|
||||
src/libslic3r/ExtrusionEntity.cpp
|
||||
src/libslic3r/Flow.cpp
|
||||
src/libslic3r/Format/AMF.cpp
|
||||
|
|
@ -171,9 +220,25 @@ src/slic3r/Utils/MKS.cpp
|
|||
src/slic3r/Utils/OctoPrint.cpp
|
||||
src/slic3r/Utils/Repetier.cpp
|
||||
src/slic3r/Utils/ProfileDescription.hpp
|
||||
src/slic3r/GUI/SendMultiMachinePage.cpp
|
||||
src/slic3r/GUI/MultiMachinePage.cpp
|
||||
src/slic3r/GUI/MultiMachineManagerPage.cpp
|
||||
src/slic3r/GUI/MultiTaskManagerPage.cpp
|
||||
src/slic3r/GUI/MultiMachine.cpp
|
||||
src/slic3r/GUI/FilamentMapDialog.cpp
|
||||
src/slic3r/GUI/FilamentGroupPopup.cpp
|
||||
src/slic3r/GUI/FilamentMapPanel.cpp
|
||||
src/slic3r/Utils/Obico.cpp
|
||||
src/slic3r/Utils/SimplyPrint.cpp
|
||||
src/slic3r/Utils/Flashforge.cpp
|
||||
src/slic3r/GUI/Jobs/OAuthJob.cpp
|
||||
src/slic3r/GUI/BackgroundSlicingProcess.cpp
|
||||
src/slic3r/GUI/Gizmos/GLGizmoBrimEars.cpp
|
||||
src/slic3r/GUI/PartSkipDialog.cpp
|
||||
src/slic3r/GUI/PartSkipDialog.hpp
|
||||
src/slic3r/GUI/SkipPartCanvas.cpp
|
||||
src/slic3r/GUI/SkipPartCanvas.hpp
|
||||
src/slic3r/GUI/FilamentBitmapUtils.cpp
|
||||
src/slic3r/GUI/FilamentBitmapUtils.hpp
|
||||
src/slic3r/GUI/FilamentPickerDialog.cpp
|
||||
src/slic3r/GUI/FilamentPickerDialog.hpp
|
||||
|
|
|
|||
21098
localization/i18n/vi/OrcaSlicer_vi.po
Normal file
BIN
resources/calib/cornering/SCV-V2.stl
Normal file
BIN
resources/calib/pressure_advance/auto_pa_line_dual.3mf
Normal file
BIN
resources/calib/pressure_advance/auto_pa_line_single.3mf
Normal file
|
|
@ -1,4 +1,92 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIFfzCCA2egAwIBAgIUXtzR6tRiL/RHBRXOoyFU0+XrliowDQYJKoZIhvcNAQEL
|
||||
BQAwRjELMAkGA1UEBhMCQ04xITAfBgNVBAoMGEJCTCBUZWNobm9sb2dpZXMgQ28u
|
||||
IEx0ZDEUMBIGA1UEAwwLQkJMIENBMiBSU0EwIBcNMjUwNjE3MDEzODA4WhgPMjA1
|
||||
MDA2MTcwMTM4MDhaMEYxCzAJBgNVBAYTAkNOMSEwHwYDVQQKDBhCQkwgVGVjaG5v
|
||||
bG9naWVzIENvLiBMdGQxFDASBgNVBAMMC0JCTCBDQTIgUlNBMIICIjANBgkqhkiG
|
||||
9w0BAQEFAAOCAg8AMIICCgKCAgEAo4550G4c42gTKzQqixwKT089RizIdZpyOcGA
|
||||
679rPaOdWsMqVwnYPP2FpMqXKkjFbedE+SpGloi2NKCuiPNVRbq9PHOOZwTs7YLo
|
||||
bOwf53FJuO6vRFpzFfX1tlc9zlFqJvZnYO9NgHpMysidocWcgrDN/SIDywgPB5CV
|
||||
bYg3Vvzua9fwZx9e5KT9xd5IpTqdTrWS47jQOVKLhdQCbJFIlMrblOwLBAx+fHok
|
||||
wqh6tkI6Ktuyyjw8Dysebi1ndWjKtZ2mW47r8xZ/J+z3EZqcyJMY6MRtx/zb1jBF
|
||||
uHtkjrb5Kv1DMzSKlkaNJIbvC+Mk+hI97W+SjLSRuIdC7+oJUzWaSzgu9cjXCVfm
|
||||
q8t4IL/35hP69PK95LgLectIrP96CYAT/aVMG19FrFW0QWEyfT+kzG4jkumfPbHq
|
||||
Y2nNkEN0+tjj3h4WdzrWgQEojK/lhfcRFVkts74+aZoMpQP+vmL17CKmSzXk5o/e
|
||||
K21xgxJdzMbdztfTpibiXk0abfOpN+1VR+3NYa+bROAKNyGaReEGsyW2bjcjNx51
|
||||
5Vqzj3SVxhMSp5vfF9E4A1jE99M/l9jQDM6RzkT0lMccGAd5tUSdNvDlrqtQaQiK
|
||||
v/ZsXPgXLTWfOpvaLNEgwdMgZMuhjpkwvAZyoYfeF9kyydjDh7bvrX//cz/VopAU
|
||||
lxUtQtMCAwEAAaNjMGEwHQYDVR0OBBYEFNVJgQad1sNTN0jxVkwbJ/XM1an1MB8G
|
||||
A1UdIwQYMBaAFNVJgQad1sNTN0jxVkwbJ/XM1an1MA8GA1UdEwEB/wQFMAMBAf8w
|
||||
DgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQBFZDKMJfp/N4gBeFHh
|
||||
MiFehaUyMS6e9mzrTfMLJLJoj6Jopa9V9jIfcCEBGZuRThqFcATV+UdFHSINpUcH
|
||||
upcCYnazTRC4dn1hnxnQ1ojQcHxdGp9xGw/YclAKD97d8bPShfBMT1to9zbMK7T5
|
||||
L8zgqg01YIOKjQk0Hcd0+0iUr6m8zQ5P8Rl3QXqAyeWgqmYQrrjTWwPsgdfHNXKX
|
||||
vDrx7/cqry5lKU802hUplKMBxelv4W8407Ytj1lfJOwvxqxxsFU5jSwcUG3zo2vk
|
||||
QtjRs8m5BKup5K1OPYkkPu7Ld89X0XpU073/dNDG11uxb1eDKrtNP6vZuZjNE2Pq
|
||||
8HCoI1EtP+ItyqtUMvHi6Z2zsmlA25broVioeUKxjlIecpQ9JR/FhDu9CWNF/nDW
|
||||
LSORNaMMzgsMSzI+HCiUhqN+qMIvVP6rzGTJzwqz/lc5Lf+ZPCnGA9WJTT4uPIhf
|
||||
ufbZmnUJ35WuWKHxovDsqBh88zQ9sZ+ei4Hi4vVzOhUgfG3aLoSQEYqRoqaboANh
|
||||
wCwzyuW2Rv54u5QSBbd6Gx1OpvsWmLPWd2/iL2kISl5wfmLGVydvSJa+rbOfuAy7
|
||||
ycVQacVDQCAnbhoVrQy7+454QsKSW3ZV6BcyRrorewCyCYgd7nyxflxHZTBEykXX
|
||||
haGNe/KFNvJBMOIuIUzknRRmiQ==
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIB8zCCAZmgAwIBAgIUe61jGQ4RzIC8k+sNuqbI/CaNqPIwCgYIKoZIzj0EAwIw
|
||||
RjELMAkGA1UEBhMCQ04xITAfBgNVBAoMGEJCTCBUZWNobm9sb2dpZXMgQ28uIEx0
|
||||
ZDEUMBIGA1UEAwwLQkJMIENBMiBFQ0MwIBcNMjUwNjE3MDEzODM1WhgPMjA1MDA2
|
||||
MTcwMTM4MzVaMEYxCzAJBgNVBAYTAkNOMSEwHwYDVQQKDBhCQkwgVGVjaG5vbG9n
|
||||
aWVzIENvLiBMdGQxFDASBgNVBAMMC0JCTCBDQTIgRUNDMFkwEwYHKoZIzj0CAQYI
|
||||
KoZIzj0DAQcDQgAEpKTF7wRSty4DXpGJzgCPwRh8ghLlxUC3qJbyEgLqTvJgbiwY
|
||||
APPHK7kVbVmerkqhHOT4QeWRlTG3dOQGLA2VpaNjMGEwHQYDVR0OBBYEFKuRpsjY
|
||||
REOyIKH7HwOE6jhGBd6NMB8GA1UdIwQYMBaAFKuRpsjYREOyIKH7HwOE6jhGBd6N
|
||||
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMCA0gA
|
||||
MEUCIErBiUm3VdtP3rz4kb8aLpI5p+BzL7M9vElBGWWJxpHMAiEA3r5tJWVGwuxi
|
||||
YCrB1c40KYFRFyahGrhOJZAj/YhRdnU=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEeTCCA2GgAwIBAgIUOq+lNIaC2xsswkFqj5JPyVBl45cwDQYJKoZIhvcNAQEL
|
||||
BQAwQjELMAkGA1UEBhMCQ04xIjAgBgNVBAoMGUJCTCBUZWNobm9sb2dpZXMgQ28u
|
||||
LCBMdGQxDzANBgNVBAMMBkJCTCBDQTAeFw0yNTA2MTcwMjAxMjdaFw0zNTA2MTUw
|
||||
MjAxMjdaMEYxCzAJBgNVBAYTAkNOMSEwHwYDVQQKDBhCQkwgVGVjaG5vbG9naWVz
|
||||
IENvLiBMdGQxFDASBgNVBAMMC0JCTCBDQTIgUlNBMIICIjANBgkqhkiG9w0BAQEF
|
||||
AAOCAg8AMIICCgKCAgEAo4550G4c42gTKzQqixwKT089RizIdZpyOcGA679rPaOd
|
||||
WsMqVwnYPP2FpMqXKkjFbedE+SpGloi2NKCuiPNVRbq9PHOOZwTs7YLobOwf53FJ
|
||||
uO6vRFpzFfX1tlc9zlFqJvZnYO9NgHpMysidocWcgrDN/SIDywgPB5CVbYg3Vvzu
|
||||
a9fwZx9e5KT9xd5IpTqdTrWS47jQOVKLhdQCbJFIlMrblOwLBAx+fHokwqh6tkI6
|
||||
Ktuyyjw8Dysebi1ndWjKtZ2mW47r8xZ/J+z3EZqcyJMY6MRtx/zb1jBFuHtkjrb5
|
||||
Kv1DMzSKlkaNJIbvC+Mk+hI97W+SjLSRuIdC7+oJUzWaSzgu9cjXCVfmq8t4IL/3
|
||||
5hP69PK95LgLectIrP96CYAT/aVMG19FrFW0QWEyfT+kzG4jkumfPbHqY2nNkEN0
|
||||
+tjj3h4WdzrWgQEojK/lhfcRFVkts74+aZoMpQP+vmL17CKmSzXk5o/eK21xgxJd
|
||||
zMbdztfTpibiXk0abfOpN+1VR+3NYa+bROAKNyGaReEGsyW2bjcjNx515Vqzj3SV
|
||||
xhMSp5vfF9E4A1jE99M/l9jQDM6RzkT0lMccGAd5tUSdNvDlrqtQaQiKv/ZsXPgX
|
||||
LTWfOpvaLNEgwdMgZMuhjpkwvAZyoYfeF9kyydjDh7bvrX//cz/VopAUlxUtQtMC
|
||||
AwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
|
||||
BBYEFNVJgQad1sNTN0jxVkwbJ/XM1an1MB8GA1UdIwQYMBaAFI80QmjcZ06PxCKe
|
||||
xXxJ5avdRL4eMA0GCSqGSIb3DQEBCwUAA4IBAQAvS8tyfagaGsFf9YncA2ko/Na5
|
||||
9BVF+8TlUo+32oznwIVpS1AhSgLP6rNVekXNFKbuP5htudLQ17ZRBJI/UMVyYEDq
|
||||
IN7xv7Zj+zJwF6W6haYrjb2Vk8igw1XvNULZfvVNNKIkvJUiVqEslWrC+k74crk/
|
||||
Wv8ChVf+zqvfIN6LV3esaGRL02J3AprQGb7DDhR1EefQMScDkNpGJMUmvCmfknrl
|
||||
iK8qgvQN1SWO7JRf6fNKHsN1ZQvyP0pgLWxpT3V0/0/WttqX3cMGuJF+jVUzm/Nh
|
||||
xYhFewG8vc3KzTjnwQApMA6CW554FOJWFyOD2jn5yJLT3Vue+aYDQRp4bKMx
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICrjCCAZagAwIBAgIUOq+lNIaC2xsswkFqj5JPyVBl45gwDQYJKoZIhvcNAQEL
|
||||
BQAwQjELMAkGA1UEBhMCQ04xIjAgBgNVBAoMGUJCTCBUZWNobm9sb2dpZXMgQ28u
|
||||
LCBMdGQxDzANBgNVBAMMBkJCTCBDQTAeFw0yNTA2MTcwMjAxNDdaFw0zNTA2MTUw
|
||||
MjAxNDdaMEYxCzAJBgNVBAYTAkNOMSEwHwYDVQQKDBhCQkwgVGVjaG5vbG9naWVz
|
||||
IENvLiBMdGQxFDASBgNVBAMMC0JCTCBDQTIgRUNDMFkwEwYHKoZIzj0CAQYIKoZI
|
||||
zj0DAQcDQgAEpKTF7wRSty4DXpGJzgCPwRh8ghLlxUC3qJbyEgLqTvJgbiwYAPPH
|
||||
K7kVbVmerkqhHOT4QeWRlTG3dOQGLA2VpaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAO
|
||||
BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFKuRpsjYREOyIKH7HwOE6jhGBd6NMB8G
|
||||
A1UdIwQYMBaAFI80QmjcZ06PxCKexXxJ5avdRL4eMA0GCSqGSIb3DQEBCwUAA4IB
|
||||
AQCg6PjUSSZV+4bvejcVMvgXmKzfD95osWn0ctnoMBxPDa+m+Gg+BcLT2IlFAe3E
|
||||
KYMvu4T295WQc92rjKYqW6cirFppng9uEFW2mZLimxaSmutsTftE3sbMVMJ/SLYN
|
||||
PV7TFv6mcBSIFWXwmBOIpbh4BUcVfONTvdSfIqfyAVxsq4xzc2nc6hPBpAm21Ayj
|
||||
ToC1ev/TbDJ8VllFZiEVmWWlIP3aNzAm8S2mOpxPB2WnanaZHSrvXLFhstyzwrjD
|
||||
yO1/isOZ7wtr7rcuTJdEvvvCimOZlkfRhaDoTew9tQ0E2FVpzzSinw02qmQ1xIE9
|
||||
5/H5ZzJSPkpeAHWEPnKkxg0v
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDZTCCAk2gAwIBAgIUV1FckwXElyek1onFnQ9kL7Bk4N8wDQYJKoZIhvcNAQEL
|
||||
BQAwQjELMAkGA1UEBhMCQ04xIjAgBgNVBAoMGUJCTCBUZWNobm9sb2dpZXMgQ28u
|
||||
LCBMdGQxDzANBgNVBAMMBkJCTCBDQTAeFw0yMjA0MDQwMzQyMTFaFw0zMjA0MDEw
|
||||
|
|
@ -18,4 +106,4 @@ BdOoo96iX89rRPoxeed1cpq5hZwbeka3+CJGV76itWp35Up5rmmUqrlyQOr/Wax6
|
|||
itosIzG0MfhgUzU51A2P/hSnD3NDMXv+wUY/AvqgIL7u7fbDKnku1GzEKIkfH8hm
|
||||
Rs6d8SCU89xyrwzQ0PR853irHas3WrHVqab3P+qNwR0YirL0Qk7Xt/q3O1griNg2
|
||||
Blbjg3obpHo9
|
||||
-----END CERTIFICATE-----
|
||||
-----END CERTIFICATE-----
|
||||
329
resources/flush/flush_data_dual_highflow.txt
Normal file
|
|
@ -0,0 +1,329 @@
|
|||
colors
|
||||
#000000 #FFFFFF #545454 #8E9089 #C12E1F #F4EE2A #0086D6 #F7E6DE #00AE42 #5E43B7 #482960 #0056B8 #FEC600 #EC008C #F5547C #6F5034 #FF9016 #00B1B7 #BECF00
|
||||
src dst flush
|
||||
#000000 #FFFFFF 900
|
||||
#000000 #545454 270
|
||||
#000000 #C12E1F 900
|
||||
#000000 #F4EE2A 900
|
||||
#000000 #0086D6 900
|
||||
#000000 #F7E6DE 900
|
||||
#000000 #00AE42 900
|
||||
#000000 #5E43B7 900
|
||||
#000000 #482960 360
|
||||
#000000 #0056B8 660
|
||||
#000000 #FEC600 900
|
||||
#000000 #EC008C 900
|
||||
#000000 #F5547C 900
|
||||
#000000 #6F5034 510
|
||||
#000000 #FF9016 900
|
||||
#000000 #BECF00 900
|
||||
#FFFFFF #000000 120
|
||||
#FFFFFF #545454 150
|
||||
#FFFFFF #8E9089 120
|
||||
#FFFFFF #C12E1F 120
|
||||
#FFFFFF #F4EE2A 150
|
||||
#FFFFFF #0086D6 90
|
||||
#FFFFFF #F7E6DE 120
|
||||
#FFFFFF #00AE42 120
|
||||
#FFFFFF #5E43B7 150
|
||||
#FFFFFF #482960 120
|
||||
#FFFFFF #0056B8 150
|
||||
#FFFFFF #FEC600 120
|
||||
#FFFFFF #EC008C 150
|
||||
#FFFFFF #F5547C 120
|
||||
#FFFFFF #6F5034 150
|
||||
#FFFFFF #FF9016 120
|
||||
#FFFFFF #00B1B7 90
|
||||
#FFFFFF #BECF00 120
|
||||
#545454 #000000 150
|
||||
#545454 #FFFFFF 480
|
||||
#545454 #8E9089 210
|
||||
#545454 #C12E1F 270
|
||||
#545454 #F4EE2A 390
|
||||
#545454 #0086D6 240
|
||||
#545454 #F7E6DE 360
|
||||
#545454 #00AE42 330
|
||||
#545454 #5E43B7 180
|
||||
#545454 #482960 150
|
||||
#545454 #0056B8 180
|
||||
#545454 #FEC600 300
|
||||
#545454 #EC008C 240
|
||||
#545454 #F5547C 330
|
||||
#545454 #6F5034 120
|
||||
#545454 #FF9016 330
|
||||
#545454 #00B1B7 270
|
||||
#545454 #BECF00 330
|
||||
#8E9089 #000000 180
|
||||
#8E9089 #FFFFFF 330
|
||||
#8E9089 #545454 180
|
||||
#8E9089 #C12E1F 180
|
||||
#8E9089 #F4EE2A 360
|
||||
#8E9089 #0086D6 180
|
||||
#8E9089 #F7E6DE 360
|
||||
#8E9089 #00AE42 120
|
||||
#8E9089 #5E43B7 240
|
||||
#8E9089 #482960 240
|
||||
#8E9089 #0056B8 150
|
||||
#8E9089 #FEC600 330
|
||||
#8E9089 #EC008C 270
|
||||
#8E9089 #F5547C 240
|
||||
#8E9089 #6F5034 300
|
||||
#8E9089 #FF9016 300
|
||||
#8E9089 #00B1B7 180
|
||||
#8E9089 #BECF00 300
|
||||
#C12E1F #000000 150
|
||||
#C12E1F #FFFFFF 600
|
||||
#C12E1F #545454 570
|
||||
#C12E1F #8E9089 390
|
||||
#C12E1F #F4EE2A 900
|
||||
#C12E1F #0086D6 900
|
||||
#C12E1F #F7E6DE 900
|
||||
#C12E1F #00AE42 540
|
||||
#C12E1F #5E43B7 570
|
||||
#C12E1F #482960 210
|
||||
#C12E1F #0056B8 630
|
||||
#C12E1F #FEC600 420
|
||||
#C12E1F #EC008C 270
|
||||
#C12E1F #F5547C 300
|
||||
#C12E1F #6F5034 300
|
||||
#C12E1F #FF9016 390
|
||||
#C12E1F #00B1B7 600
|
||||
#C12E1F #BECF00 660
|
||||
#F4EE2A #000000 150
|
||||
#F4EE2A #FFFFFF 660
|
||||
#F4EE2A #545454 420
|
||||
#F4EE2A #8E9089 300
|
||||
#F4EE2A #C12E1F 180
|
||||
#F4EE2A #0086D6 900
|
||||
#F4EE2A #F7E6DE 900
|
||||
#F4EE2A #00AE42 180
|
||||
#F4EE2A #5E43B7 690
|
||||
#F4EE2A #0056B8 360
|
||||
#F4EE2A #FEC600 120
|
||||
#F4EE2A #EC008C 600
|
||||
#F4EE2A #F5547C 240
|
||||
#F4EE2A #6F5034 270
|
||||
#F4EE2A #FF9016 120
|
||||
#F4EE2A #00B1B7 630
|
||||
#F4EE2A #BECF00 120
|
||||
#0086D6 #000000 120
|
||||
#0086D6 #FFFFFF 510
|
||||
#0086D6 #545454 150
|
||||
#0086D6 #8E9089 180
|
||||
#0086D6 #C12E1F 300
|
||||
#0086D6 #F4EE2A 360
|
||||
#0086D6 #F7E6DE 480
|
||||
#0086D6 #00AE42 120
|
||||
#0086D6 #5E43B7 210
|
||||
#0086D6 #482960 120
|
||||
#0086D6 #0056B8 150
|
||||
#0086D6 #FEC600 330
|
||||
#0086D6 #EC008C 330
|
||||
#0086D6 #F5547C 330
|
||||
#0086D6 #6F5034 150
|
||||
#0086D6 #FF9016 300
|
||||
#0086D6 #00B1B7 120
|
||||
#0086D6 #BECF00 360
|
||||
#F7E6DE #000000 150
|
||||
#F7E6DE #FFFFFF 150
|
||||
#F7E6DE #545454 120
|
||||
#F7E6DE #8E9089 150
|
||||
#F7E6DE #C12E1F 150
|
||||
#F7E6DE #F4EE2A 120
|
||||
#F7E6DE #0086D6 180
|
||||
#F7E6DE #00AE42 150
|
||||
#F7E6DE #5E43B7 210
|
||||
#F7E6DE #482960 150
|
||||
#F7E6DE #0056B8 150
|
||||
#F7E6DE #FEC600 120
|
||||
#F7E6DE #EC008C 150
|
||||
#F7E6DE #F5547C 150
|
||||
#F7E6DE #6F5034 150
|
||||
#F7E6DE #FF9016 120
|
||||
#F7E6DE #00B1B7 120
|
||||
#F7E6DE #BECF00 120
|
||||
#00AE42 #000000 120
|
||||
#00AE42 #FFFFFF 690
|
||||
#00AE42 #545454 330
|
||||
#00AE42 #8E9089 330
|
||||
#00AE42 #C12E1F 270
|
||||
#00AE42 #F4EE2A 480
|
||||
#00AE42 #0086D6 750
|
||||
#00AE42 #F7E6DE 900
|
||||
#00AE42 #5E43B7 450
|
||||
#00AE42 #482960 210
|
||||
#00AE42 #0056B8 240
|
||||
#00AE42 #FEC600 420
|
||||
#00AE42 #F5547C 390
|
||||
#00AE42 #6F5034 210
|
||||
#00AE42 #FF9016 420
|
||||
#00AE42 #00B1B7 390
|
||||
#00AE42 #BECF00 300
|
||||
#5E43B7 #000000 150
|
||||
#5E43B7 #FFFFFF 360
|
||||
#5E43B7 #545454 150
|
||||
#5E43B7 #8E9089 180
|
||||
#5E43B7 #C12E1F 270
|
||||
#5E43B7 #F4EE2A 570
|
||||
#5E43B7 #0086D6 240
|
||||
#5E43B7 #F7E6DE 660
|
||||
#5E43B7 #00AE42 240
|
||||
#5E43B7 #482960 240
|
||||
#5E43B7 #0056B8 150
|
||||
#5E43B7 #FEC600 390
|
||||
#5E43B7 #EC008C 330
|
||||
#5E43B7 #F5547C 270
|
||||
#5E43B7 #6F5034 150
|
||||
#5E43B7 #FF9016 300
|
||||
#5E43B7 #00B1B7 270
|
||||
#5E43B7 #BECF00 390
|
||||
#482960 #000000 120
|
||||
#482960 #FFFFFF 570
|
||||
#482960 #545454 240
|
||||
#482960 #8E9089 330
|
||||
#482960 #C12E1F 480
|
||||
#482960 #F4EE2A 780
|
||||
#482960 #0086D6 420
|
||||
#482960 #F7E6DE 900
|
||||
#482960 #00AE42 510
|
||||
#482960 #5E43B7 270
|
||||
#482960 #0056B8 420
|
||||
#482960 #FEC600 540
|
||||
#482960 #EC008C 480
|
||||
#482960 #F5547C 390
|
||||
#482960 #6F5034 270
|
||||
#482960 #FF9016 510
|
||||
#482960 #00B1B7 480
|
||||
#482960 #BECF00 540
|
||||
#0056B8 #000000 120
|
||||
#0056B8 #FFFFFF 900
|
||||
#0056B8 #545454 240
|
||||
#0056B8 #8E9089 330
|
||||
#0056B8 #C12E1F 570
|
||||
#0056B8 #F4EE2A 900
|
||||
#0056B8 #0086D6 210
|
||||
#0056B8 #F7E6DE 780
|
||||
#0056B8 #00AE42 300
|
||||
#0056B8 #5E43B7 210
|
||||
#0056B8 #482960 270
|
||||
#0056B8 #FEC600 630
|
||||
#0056B8 #EC008C 540
|
||||
#0056B8 #F5547C 660
|
||||
#0056B8 #6F5034 300
|
||||
#0056B8 #FF9016 690
|
||||
#0056B8 #00B1B7 240
|
||||
#0056B8 #BECF00 540
|
||||
#FEC600 #000000 120
|
||||
#FEC600 #FFFFFF 630
|
||||
#FEC600 #545454 540
|
||||
#FEC600 #8E9089 480
|
||||
#FEC600 #C12E1F 180
|
||||
#FEC600 #F4EE2A 180
|
||||
#FEC600 #0086D6 900
|
||||
#FEC600 #F7E6DE 720
|
||||
#FEC600 #00AE42 210
|
||||
#FEC600 #5E43B7 900
|
||||
#FEC600 #482960 330
|
||||
#FEC600 #0056B8 900
|
||||
#FEC600 #EC008C 660
|
||||
#FEC600 #F5547C 390
|
||||
#FEC600 #6F5034 330
|
||||
#FEC600 #FF9016 270
|
||||
#FEC600 #00B1B7 630
|
||||
#FEC600 #BECF00 210
|
||||
#EC008C #000000 120
|
||||
#EC008C #FFFFFF 540
|
||||
#EC008C #545454 270
|
||||
#EC008C #8E9089 330
|
||||
#EC008C #C12E1F 120
|
||||
#EC008C #F4EE2A 900
|
||||
#EC008C #0086D6 330
|
||||
#EC008C #00AE42 450
|
||||
#EC008C #5E43B7 210
|
||||
#EC008C #482960 180
|
||||
#EC008C #0056B8 300
|
||||
#EC008C #FEC600 360
|
||||
#EC008C #F5547C 210
|
||||
#EC008C #6F5034 240
|
||||
#EC008C #FF9016 240
|
||||
#EC008C #00B1B7 450
|
||||
#EC008C #BECF00 510
|
||||
#F5547C #000000 120
|
||||
#F5547C #FFFFFF 570
|
||||
#F5547C #545454 210
|
||||
#F5547C #8E9089 240
|
||||
#F5547C #C12E1F 150
|
||||
#F5547C #F4EE2A 750
|
||||
#F5547C #0086D6 270
|
||||
#F5547C #F7E6DE 900
|
||||
#F5547C #00AE42 540
|
||||
#F5547C #5E43B7 150
|
||||
#F5547C #482960 180
|
||||
#F5547C #0056B8 150
|
||||
#F5547C #FEC600 330
|
||||
#F5547C #EC008C 150
|
||||
#F5547C #6F5034 180
|
||||
#F5547C #FF9016 270
|
||||
#F5547C #00B1B7 390
|
||||
#F5547C #BECF00 360
|
||||
#6F5034 #000000 150
|
||||
#6F5034 #FFFFFF 600
|
||||
#6F5034 #545454 150
|
||||
#6F5034 #8E9089 270
|
||||
#6F5034 #C12E1F 180
|
||||
#6F5034 #F4EE2A 360
|
||||
#6F5034 #0086D6 360
|
||||
#6F5034 #F7E6DE 390
|
||||
#6F5034 #00AE42 330
|
||||
#6F5034 #5E43B7 240
|
||||
#6F5034 #482960 180
|
||||
#6F5034 #0056B8 300
|
||||
#6F5034 #FEC600 300
|
||||
#6F5034 #EC008C 270
|
||||
#6F5034 #F5547C 240
|
||||
#6F5034 #FF9016 270
|
||||
#6F5034 #00B1B7 270
|
||||
#6F5034 #BECF00 390
|
||||
#FF9016 #000000 120
|
||||
#FF9016 #FFFFFF 450
|
||||
#FF9016 #545454 240
|
||||
#FF9016 #8E9089 300
|
||||
#FF9016 #C12E1F 150
|
||||
#FF9016 #F4EE2A 480
|
||||
#FF9016 #0086D6 660
|
||||
#FF9016 #F7E6DE 690
|
||||
#FF9016 #00AE42 360
|
||||
#FF9016 #5E43B7 360
|
||||
#FF9016 #482960 210
|
||||
#FF9016 #0056B8 330
|
||||
#FF9016 #FEC600 210
|
||||
#FF9016 #EC008C 240
|
||||
#FF9016 #F5547C 210
|
||||
#FF9016 #6F5034 270
|
||||
#FF9016 #00B1B7 390
|
||||
#FF9016 #BECF00 330
|
||||
#00B1B7 #FFFFFF 630
|
||||
#00B1B7 #8E9089 240
|
||||
#00B1B7 #F4EE2A 390
|
||||
#00B1B7 #EC008C 240
|
||||
#00B1B7 #6F5034 360
|
||||
#00B1B7 #FF9016 300
|
||||
#00B1B7 #00B1B7 390
|
||||
#00B1B7 #BECF00 300
|
||||
#BECF00 #000000 150
|
||||
#BECF00 #FFFFFF 630
|
||||
#BECF00 #8E9089 300
|
||||
#BECF00 #C12E1F 150
|
||||
#BECF00 #F4EE2A 150
|
||||
#BECF00 #0086D6 270
|
||||
#BECF00 #F7E6DE 540
|
||||
#BECF00 #00AE42 150
|
||||
#BECF00 #5E43B7 270
|
||||
#BECF00 #482960 210
|
||||
#BECF00 #0056B8 240
|
||||
#BECF00 #FEC600 120
|
||||
#BECF00 #EC008C 270
|
||||
#BECF00 #F5547C 270
|
||||
#BECF00 #6F5034 150
|
||||
#BECF00 #FF9016 120
|
||||
#BECF00 #00B1B7 330
|
||||
338
resources/flush/flush_data_dual_standard.txt
Normal file
|
|
@ -0,0 +1,338 @@
|
|||
colors
|
||||
#000000 #FFFFFF #545454 #8E9089 #C12E1F #F4EE2A #0086D6 #F7E6DE #00AE42 #5E43B7 #482960 #0056B8 #FEC600 #EC008C #F5547C #6F5034 #FF9016 #00B1B7 #BECF00
|
||||
src dst flush
|
||||
#000000 #FFFFFF 900
|
||||
#000000 #545454 450
|
||||
#000000 #8E9089 540
|
||||
#000000 #C12E1F 600
|
||||
#000000 #F4EE2A 900
|
||||
#000000 #0086D6 570
|
||||
#000000 #F7E6DE 900
|
||||
#000000 #00AE42 810
|
||||
#000000 #5E43B7 480
|
||||
#000000 #482960 270
|
||||
#000000 #0056B8 540
|
||||
#000000 #FEC600 900
|
||||
#000000 #EC008C 900
|
||||
#000000 #F5547C 900
|
||||
#000000 #FF9016 900
|
||||
#000000 #00B1B7 630
|
||||
#000000 #BECF00 900
|
||||
#FFFFFF #000000 90
|
||||
#FFFFFF #545454 240
|
||||
#FFFFFF #8E9089 120
|
||||
#FFFFFF #C12E1F 90
|
||||
#FFFFFF #F4EE2A 90
|
||||
#FFFFFF #0086D6 90
|
||||
#FFFFFF #F7E6DE 90
|
||||
#FFFFFF #00AE42 120
|
||||
#FFFFFF #5E43B7 90
|
||||
#FFFFFF #0056B8 90
|
||||
#FFFFFF #FEC600 150
|
||||
#FFFFFF #EC008C 150
|
||||
#FFFFFF #F5547C 120
|
||||
#FFFFFF #6F5034 120
|
||||
#FFFFFF #FF9016 120
|
||||
#FFFFFF #00B1B7 120
|
||||
#FFFFFF #BECF00 90
|
||||
#545454 #000000 90
|
||||
#545454 #FFFFFF 360
|
||||
#545454 #8E9089 120
|
||||
#545454 #C12E1F 270
|
||||
#545454 #F4EE2A 330
|
||||
#545454 #0086D6 270
|
||||
#545454 #F7E6DE 390
|
||||
#545454 #00AE42 270
|
||||
#545454 #5E43B7 120
|
||||
#545454 #482960 150
|
||||
#545454 #0056B8 180
|
||||
#545454 #FEC600 300
|
||||
#545454 #EC008C 240
|
||||
#545454 #F5547C 300
|
||||
#545454 #6F5034 120
|
||||
#545454 #FF9016 240
|
||||
#545454 #00B1B7 270
|
||||
#545454 #BECF00 300
|
||||
#8E9089 #000000 270
|
||||
#8E9089 #FFFFFF 330
|
||||
#8E9089 #545454 300
|
||||
#8E9089 #C12E1F 240
|
||||
#8E9089 #F4EE2A 240
|
||||
#8E9089 #0086D6 240
|
||||
#8E9089 #F7E6DE 390
|
||||
#8E9089 #00AE42 210
|
||||
#8E9089 #5E43B7 270
|
||||
#8E9089 #482960 300
|
||||
#8E9089 #0056B8 180
|
||||
#8E9089 #FEC600 240
|
||||
#8E9089 #EC008C 240
|
||||
#8E9089 #F5547C 240
|
||||
#8E9089 #6F5034 210
|
||||
#8E9089 #FF9016 240
|
||||
#8E9089 #00B1B7 210
|
||||
#8E9089 #BECF00 270
|
||||
#C12E1F #000000 150
|
||||
#C12E1F #FFFFFF 900
|
||||
#C12E1F #545454 300
|
||||
#C12E1F #8E9089 570
|
||||
#C12E1F #F4EE2A 450
|
||||
#C12E1F #0086D6 390
|
||||
#C12E1F #F7E6DE 630
|
||||
#C12E1F #00AE42 420
|
||||
#C12E1F #5E43B7 330
|
||||
#C12E1F #482960 210
|
||||
#C12E1F #0056B8 300
|
||||
#C12E1F #FEC600 660
|
||||
#C12E1F #EC008C 240
|
||||
#C12E1F #F5547C 180
|
||||
#C12E1F #6F5034 210
|
||||
#C12E1F #FF9016 270
|
||||
#C12E1F #00B1B7 540
|
||||
#C12E1F #BECF00 360
|
||||
#F4EE2A #000000 150
|
||||
#F4EE2A #FFFFFF 900
|
||||
#F4EE2A #545454 390
|
||||
#F4EE2A #8E9089 450
|
||||
#F4EE2A #C12E1F 180
|
||||
#F4EE2A #0086D6 270
|
||||
#F4EE2A #F7E6DE 570
|
||||
#F4EE2A #00AE42 120
|
||||
#F4EE2A #5E43B7 330
|
||||
#F4EE2A #482960 330
|
||||
#F4EE2A #0056B8 240
|
||||
#F4EE2A #FEC600 90
|
||||
#F4EE2A #EC008C 330
|
||||
#F4EE2A #F5547C 420
|
||||
#F4EE2A #6F5034 240
|
||||
#F4EE2A #FF9016 150
|
||||
#F4EE2A #00B1B7 360
|
||||
#F4EE2A #BECF00 240
|
||||
#0086D6 #000000 150
|
||||
#0086D6 #FFFFFF 420
|
||||
#0086D6 #545454 120
|
||||
#0086D6 #8E9089 480
|
||||
#0086D6 #C12E1F 240
|
||||
#0086D6 #F4EE2A 360
|
||||
#0086D6 #F7E6DE 390
|
||||
#0086D6 #00AE42 120
|
||||
#0086D6 #5E43B7 150
|
||||
#0086D6 #482960 150
|
||||
#0086D6 #0056B8 120
|
||||
#0086D6 #EC008C 330
|
||||
#0086D6 #F5547C 330
|
||||
#0086D6 #6F5034 150
|
||||
#0086D6 #FF9016 300
|
||||
#0086D6 #00B1B7 150
|
||||
#0086D6 #BECF00 270
|
||||
#F7E6DE #000000 90
|
||||
#F7E6DE #FFFFFF 90
|
||||
#F7E6DE #545454 120
|
||||
#F7E6DE #8E9089 120
|
||||
#F7E6DE #C12E1F 90
|
||||
#F7E6DE #F4EE2A 60
|
||||
#F7E6DE #0086D6 90
|
||||
#F7E6DE #00AE42 90
|
||||
#F7E6DE #5E43B7 90
|
||||
#F7E6DE #482960 120
|
||||
#F7E6DE #0056B8 120
|
||||
#F7E6DE #FEC600 120
|
||||
#F7E6DE #EC008C 150
|
||||
#F7E6DE #F5547C 120
|
||||
#F7E6DE #6F5034 150
|
||||
#F7E6DE #FF9016 120
|
||||
#F7E6DE #00B1B7 90
|
||||
#F7E6DE #BECF00 120
|
||||
#00AE42 #000000 150
|
||||
#00AE42 #FFFFFF 900
|
||||
#00AE42 #545454 240
|
||||
#00AE42 #8E9089 330
|
||||
#00AE42 #C12E1F 210
|
||||
#00AE42 #F4EE2A 270
|
||||
#00AE42 #F7E6DE 360
|
||||
#00AE42 #5E43B7 180
|
||||
#00AE42 #482960 180
|
||||
#00AE42 #0056B8 240
|
||||
#00AE42 #FEC600 300
|
||||
#00AE42 #EC008C 300
|
||||
#00AE42 #F5547C 390
|
||||
#00AE42 #6F5034 180
|
||||
#00AE42 #FF9016 300
|
||||
#00AE42 #00B1B7 360
|
||||
#00AE42 #BECF00 270
|
||||
#5E43B7 #000000 90
|
||||
#5E43B7 #FFFFFF 630
|
||||
#5E43B7 #545454 150
|
||||
#5E43B7 #8E9089 210
|
||||
#5E43B7 #C12E1F 210
|
||||
#5E43B7 #F4EE2A 330
|
||||
#5E43B7 #0086D6 180
|
||||
#5E43B7 #F7E6DE 510
|
||||
#5E43B7 #00AE42 240
|
||||
#5E43B7 #482960 150
|
||||
#5E43B7 #0056B8 120
|
||||
#5E43B7 #FEC600 540
|
||||
#5E43B7 #EC008C 270
|
||||
#5E43B7 #F5547C 420
|
||||
#5E43B7 #6F5034 150
|
||||
#5E43B7 #FF9016 330
|
||||
#5E43B7 #00B1B7 270
|
||||
#5E43B7 #BECF00 330
|
||||
#482960 #000000 90
|
||||
#482960 #FFFFFF 900
|
||||
#482960 #545454 240
|
||||
#482960 #8E9089 510
|
||||
#482960 #C12E1F 360
|
||||
#482960 #F4EE2A 420
|
||||
#482960 #0086D6 330
|
||||
#482960 #F7E6DE 510
|
||||
#482960 #00AE42 390
|
||||
#482960 #5E43B7 270
|
||||
#482960 #0056B8 300
|
||||
#482960 #FEC600 660
|
||||
#482960 #EC008C 360
|
||||
#482960 #F5547C 510
|
||||
#482960 #6F5034 180
|
||||
#482960 #FF9016 540
|
||||
#482960 #00B1B7 450
|
||||
#482960 #BECF00 600
|
||||
#0056B8 #000000 90
|
||||
#0056B8 #FFFFFF 780
|
||||
#0056B8 #545454 270
|
||||
#0056B8 #8E9089 270
|
||||
#0056B8 #C12E1F 330
|
||||
#0056B8 #F4EE2A 630
|
||||
#0056B8 #0086D6 180
|
||||
#0056B8 #F7E6DE 840
|
||||
#0056B8 #00AE42 270
|
||||
#0056B8 #5E43B7 270
|
||||
#0056B8 #482960 150
|
||||
#0056B8 #FEC600 630
|
||||
#0056B8 #EC008C 450
|
||||
#0056B8 #6F5034 240
|
||||
#0056B8 #FF9016 510
|
||||
#0056B8 #00B1B7 240
|
||||
#0056B8 #BECF00 510
|
||||
#FEC600 #000000 90
|
||||
#FEC600 #FFFFFF 900
|
||||
#FEC600 #545454 390
|
||||
#FEC600 #8E9089 600
|
||||
#FEC600 #C12E1F 180
|
||||
#FEC600 #F4EE2A 150
|
||||
#FEC600 #0086D6 330
|
||||
#FEC600 #F7E6DE 600
|
||||
#FEC600 #00AE42 180
|
||||
#FEC600 #5E43B7 270
|
||||
#FEC600 #482960 330
|
||||
#FEC600 #0056B8 300
|
||||
#FEC600 #EC008C 390
|
||||
#FEC600 #F5547C 570
|
||||
#FEC600 #6F5034 240
|
||||
#FEC600 #FF9016 150
|
||||
#FEC600 #00B1B7 510
|
||||
#FEC600 #BECF00 300
|
||||
#EC008C #000000 90
|
||||
#EC008C #FFFFFF 900
|
||||
#EC008C #545454 240
|
||||
#EC008C #8E9089 270
|
||||
#EC008C #C12E1F 120
|
||||
#EC008C #F4EE2A 360
|
||||
#EC008C #0086D6 270
|
||||
#EC008C #F7E6DE 660
|
||||
#EC008C #00AE42 330
|
||||
#EC008C #5E43B7 270
|
||||
#EC008C #482960 270
|
||||
#EC008C #0056B8 210
|
||||
#EC008C #FEC600 510
|
||||
#EC008C #F5547C 120
|
||||
#EC008C #6F5034 180
|
||||
#EC008C #00B1B7 360
|
||||
#EC008C #BECF00 570
|
||||
#F5547C #000000 90
|
||||
#F5547C #FFFFFF 900
|
||||
#F5547C #545454 180
|
||||
#F5547C #8E9089 180
|
||||
#F5547C #C12E1F 150
|
||||
#F5547C #F4EE2A 270
|
||||
#F5547C #0086D6 270
|
||||
#F5547C #F7E6DE 540
|
||||
#F5547C #00AE42 300
|
||||
#F5547C #5E43B7 210
|
||||
#F5547C #482960 240
|
||||
#F5547C #0056B8 210
|
||||
#F5547C #FEC600 330
|
||||
#F5547C #EC008C 120
|
||||
#F5547C #6F5034 180
|
||||
#F5547C #FF9016 150
|
||||
#F5547C #00B1B7 300
|
||||
#F5547C #BECF00 330
|
||||
#6F5034 #000000 180
|
||||
#6F5034 #FFFFFF 660
|
||||
#6F5034 #545454 180
|
||||
#6F5034 #8E9089 240
|
||||
#6F5034 #C12E1F 240
|
||||
#6F5034 #F4EE2A 390
|
||||
#6F5034 #0086D6 330
|
||||
#6F5034 #F7E6DE 420
|
||||
#6F5034 #00AE42 300
|
||||
#6F5034 #5E43B7 300
|
||||
#6F5034 #482960 180
|
||||
#6F5034 #0056B8 300
|
||||
#6F5034 #FEC600 270
|
||||
#6F5034 #EC008C 210
|
||||
#6F5034 #F5547C 240
|
||||
#6F5034 #FF9016 240
|
||||
#6F5034 #00B1B7 270
|
||||
#6F5034 #BECF00 360
|
||||
#FF9016 #FFFFFF 900
|
||||
#FF9016 #545454 240
|
||||
#FF9016 #8E9089 270
|
||||
#FF9016 #C12E1F 150
|
||||
#FF9016 #F4EE2A 330
|
||||
#FF9016 #0086D6 240
|
||||
#FF9016 #F7E6DE 390
|
||||
#FF9016 #00AE42 240
|
||||
#FF9016 #5E43B7 270
|
||||
#FF9016 #482960 180
|
||||
#FF9016 #0056B8 240
|
||||
#FF9016 #FEC600 210
|
||||
#FF9016 #EC008C 210
|
||||
#FF9016 #F5547C 210
|
||||
#FF9016 #6F5034 180
|
||||
#FF9016 #00B1B7 300
|
||||
#FF9016 #BECF00 270
|
||||
#00B1B7 #000000 210
|
||||
#00B1B7 #FFFFFF 480
|
||||
#00B1B7 #545454 300
|
||||
#00B1B7 #8E9089 180
|
||||
#00B1B7 #C12E1F 300
|
||||
#00B1B7 #F4EE2A 300
|
||||
#00B1B7 #0086D6 150
|
||||
#00B1B7 #F7E6DE 390
|
||||
#00B1B7 #00AE42 120
|
||||
#00B1B7 #5E43B7 270
|
||||
#00B1B7 #482960 270
|
||||
#00B1B7 #0056B8 150
|
||||
#00B1B7 #FEC600 330
|
||||
#00B1B7 #EC008C 270
|
||||
#00B1B7 #F5547C 270
|
||||
#00B1B7 #6F5034 210
|
||||
#00B1B7 #FF9016 270
|
||||
#00B1B7 #BECF00 240
|
||||
#BECF00 #000000 270
|
||||
#BECF00 #FFFFFF 450
|
||||
#BECF00 #545454 270
|
||||
#BECF00 #8E9089 270
|
||||
#BECF00 #C12E1F 150
|
||||
#BECF00 #F4EE2A 90
|
||||
#BECF00 #0086D6 300
|
||||
#BECF00 #F7E6DE 300
|
||||
#BECF00 #00AE42 180
|
||||
#BECF00 #5E43B7 270
|
||||
#BECF00 #482960 210
|
||||
#BECF00 #0056B8 240
|
||||
#BECF00 #FEC600 210
|
||||
#BECF00 #EC008C 240
|
||||
#BECF00 #F5547C 150
|
||||
#BECF00 #6F5034 150
|
||||
#BECF00 #FF9016 150
|
||||
#BECF00 #00B1B7 270
|
||||
98
resources/flush/flush_data_standard.txt
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
colors
|
||||
#000000 #C12E1F #00AE42 #545454 #D1D3D5 #5B6579 #F4EE2A #9D432C #5E43B7 #0A2989 #FF6A13 #8E9089
|
||||
src dst flush
|
||||
#000000 #545454 236
|
||||
#000000 #F4EE2A 386
|
||||
#000000 #5E43B7 266
|
||||
#000000 #0A2989 236
|
||||
#C12E1F #000000 26
|
||||
#C12E1F #00AE42 326
|
||||
#C12E1F #F4EE2A 356
|
||||
#C12E1F #FF6A13 146
|
||||
#00AE42 #000000 26
|
||||
#00AE42 #C12E1F 146
|
||||
#00AE42 #545454 56
|
||||
#00AE42 #D1D3D5 266
|
||||
#00AE42 #F4EE2A 176
|
||||
#00AE42 #9D432C 86
|
||||
#00AE42 #FF6A13 206
|
||||
#00AE42 #8E9089 206
|
||||
#545454 #C12E1F 146
|
||||
#545454 #00AE42 116
|
||||
#545454 #D1D3D5 176
|
||||
#545454 #5B6579 86
|
||||
#545454 #F4EE2A 206
|
||||
#545454 #9D432C 86
|
||||
#545454 #5E43B7 56
|
||||
#545454 #FF6A13 236
|
||||
#545454 #8E9089 56
|
||||
#D1D3D5 #C12E1F 116
|
||||
#D1D3D5 #00AE42 116
|
||||
#D1D3D5 #F4EE2A 56
|
||||
#D1D3D5 #9D432C 86
|
||||
#D1D3D5 #5E43B7 86
|
||||
#D1D3D5 #FF6A13 86
|
||||
#5B6579 #000000 26
|
||||
#5B6579 #C12E1F 56
|
||||
#5B6579 #00AE42 26
|
||||
#5B6579 #545454 26
|
||||
#5B6579 #D1D3D5 56
|
||||
#5B6579 #F4EE2A 116
|
||||
#5B6579 #9D432C 56
|
||||
#5B6579 #5E43B7 26
|
||||
#5B6579 #0A2989 26
|
||||
#5B6579 #FF6A13 116
|
||||
#5B6579 #8E9089 26
|
||||
#F4EE2A #000000 56
|
||||
#F4EE2A #C12E1F 26
|
||||
#F4EE2A #00AE42 86
|
||||
#F4EE2A #545454 146
|
||||
#F4EE2A #9D432C 86
|
||||
#F4EE2A #5E43B7 146
|
||||
#F4EE2A #FF6A13 26
|
||||
#9D432C #000000 56
|
||||
#9D432C #C12E1F 56
|
||||
#9D432C #00AE42 176
|
||||
#9D432C #545454 86
|
||||
#9D432C #D1D3D5 236
|
||||
#9D432C #F4EE2A 206
|
||||
#9D432C #5E43B7 116
|
||||
#9D432C #0A2989 86
|
||||
#9D432C #FF6A13 116
|
||||
#9D432C #8E9089 146
|
||||
#5E43B7 #C12E1F 176
|
||||
#5E43B7 #00AE42 116
|
||||
#5E43B7 #545454 56
|
||||
#5E43B7 #D1D3D5 206
|
||||
#5E43B7 #5B6579 116
|
||||
#5E43B7 #F4EE2A 206
|
||||
#5E43B7 #9D432C 86
|
||||
#5E43B7 #0A2989 56
|
||||
#5E43B7 #FF6A13 206
|
||||
#5E43B7 #8E9089 146
|
||||
#0A2989 #000000 26
|
||||
#0A2989 #C12E1F 266
|
||||
#0A2989 #00AE42 146
|
||||
#0A2989 #545454 86
|
||||
#0A2989 #D1D3D5 386
|
||||
#0A2989 #5B6579 176
|
||||
#0A2989 #F4EE2A 566
|
||||
#0A2989 #9D432C 206
|
||||
#0A2989 #5E43B7 116
|
||||
#0A2989 #FF6A13 326
|
||||
#0A2989 #8E9089 206
|
||||
#FF6A13 #000000 56
|
||||
#FF6A13 #C12E1F 26
|
||||
#FF6A13 #545454 86
|
||||
#FF6A13 #D1D3D5 146
|
||||
#FF6A13 #F4EE2A 146
|
||||
#FF6A13 #9D432C 56
|
||||
#FF6A13 #5E43B7 146
|
||||
#FF6A13 #0A2989 146
|
||||
#FF6A13 #8E9089 116
|
||||
#8E9089 #C12E1F 86
|
||||
#8E9089 #00AE42 56
|
||||
#8E9089 #D1D3D5 86
|
||||
#8E9089 #F4EE2A 206
|
||||
#8E9089 #9D432C 86
|
||||
#8E9089 #FF6A13 86
|
||||