# Maintainer: Alexey Pavlov <alexpux@gmail.com>
# To build with Qt-Creator:
# 1. Launch Qt-Creator with the env (set from cmd.exe):
# set "MINGW_PREFIX=C:/msys64/ucrt64"
# set "ACLOCAL_PATH=%MINGW_PREFIX%/share/aclocal:/usr/share/aclocal"
# set "PKG_CONFIG_PATH=%MINGW_PREFIX%/lib/pkgconfig"
# set "PATH=%MINGW_PREFIX%/bin;%PATH%"
# 2. Specify the following as the CMake arguments:
# -DMINGW_LIBS=%MINGW_PREFIX% -DCMAKE_BUILD_TYPE=Debug -DWITH_SYSTEM_GLEW=ON -DWITH_SYSTEM_OPENJPEG=ON -DWITH_INSTALL_PORTABLE=OFF -DWITH_OPENCOLLADA=ON -DWITH_GAMEENGINE=ON -DWITH_RAYOPTIMIZATION=ON -DWITH_JACK=OFF -DWITH_PLAYER=ON -DWITH_CODEC_FFMPEG=ON -DWITH_CODEC_SNDFILE=ON -DWITH_CYCLES=ON -DWITH_CYCLES_CUDA_BINARIES=OFF -DWITH_CYCLES_OSL=ON -DWITH_FFTW3=ON -DWITH_MOD_OCEANSIM=ON -DPYTHON_VERSION=3.7 -DPYTHON_LIBPATH=%MINGW_PREFIX%/lib -DPYTHON_LIBRARY="python3.14m" -DPYTHON_INCLUDE_DIRS=/msys64/ucrt64/include/python3.14m -DWITH_PYTHON_INSTALL=OFF -DWITH_PYTHON_INSTALL_NUMPY=OFF -DPYTHON_NUMPY_PATH=%MINGW_PREFIX%/lib/python3.14/site-packages -DCYCLES_OSL=%MINGW_PREFIX% -DWITH_IMAGE_REDCODE=ON -DWITH_OPENMP=ON -DWITH_LLVM=ON -DLLVM_STATIC=ON

_realname=blender
pkgbase="mingw-w64-${_realname}"
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgver=5.2.0
pkgrel=5
pkgdesc='A fully integrated 3D graphics creation suite (mingw-w64)'
arch=('any')
mingw_arch=('ucrt64' 'clang64' 'clangarm64')
url='https://www.blender.org'
msys2_repository_url='https://projects.blender.org/blender/blender'
msys2_references=(
  'archlinux: blender'
  'cpe: cpe:/a:blender:blender'
)
license=('spdx:GPL-2.0-or-later')
# build conflict with "${MINGW_PACKAGE_PREFIX}-glog"
depends=(
  "${MINGW_PACKAGE_PREFIX}-alembic"
  "${MINGW_PACKAGE_PREFIX}-audaspace>=1.9.0"
  "${MINGW_PACKAGE_PREFIX}-boost-libs"
  "${MINGW_PACKAGE_PREFIX}-ceres-solver"
  "${MINGW_PACKAGE_PREFIX}-draco"
  "${MINGW_PACKAGE_PREFIX}-embree"
  "${MINGW_PACKAGE_PREFIX}-cc-libs"
  "${MINGW_PACKAGE_PREFIX}-ffmpeg"
  "${MINGW_PACKAGE_PREFIX}-fmt"
  "${MINGW_PACKAGE_PREFIX}-fftw"
  "${MINGW_PACKAGE_PREFIX}-freetype"
  "${MINGW_PACKAGE_PREFIX}-gflags>=2.3.0"
  "${MINGW_PACKAGE_PREFIX}-glog"
  "${MINGW_PACKAGE_PREFIX}-glslang"
  "${MINGW_PACKAGE_PREFIX}-gmp"
  "${MINGW_PACKAGE_PREFIX}-imath"
  #"${MINGW_PACKAGE_PREFIX}-jemalloc"
  "${MINGW_PACKAGE_PREFIX}-libepoxy"
  "${MINGW_PACKAGE_PREFIX}-libharu"
  "${MINGW_PACKAGE_PREFIX}-libiconv"
  "${MINGW_PACKAGE_PREFIX}-libjpeg-turbo"
  "${MINGW_PACKAGE_PREFIX}-libpng"
  "${MINGW_PACKAGE_PREFIX}-libsndfile"
  "${MINGW_PACKAGE_PREFIX}-libtiff"
  "${MINGW_PACKAGE_PREFIX}-libwebp"
  "${MINGW_PACKAGE_PREFIX}-libwinpthread"
  "${MINGW_PACKAGE_PREFIX}-lzo2"
  "${MINGW_PACKAGE_PREFIX}-manifold"
  "${MINGW_PACKAGE_PREFIX}-meshoptimizer"
  #"${MINGW_PACKAGE_PREFIX}-materialx"
  #"${MINGW_PACKAGE_PREFIX}-usd"
  "${MINGW_PACKAGE_PREFIX}-omp"
  "${MINGW_PACKAGE_PREFIX}-openal"
  "${MINGW_PACKAGE_PREFIX}-opencolorio"
  "${MINGW_PACKAGE_PREFIX}-openexr"
  "${MINGW_PACKAGE_PREFIX}-openimagedenoise"
  "${MINGW_PACKAGE_PREFIX}-openimageio"
  "${MINGW_PACKAGE_PREFIX}-openjpeg2"
  "${MINGW_PACKAGE_PREFIX}-openpgl"
  "${MINGW_PACKAGE_PREFIX}-openshadinglanguage"
  "${MINGW_PACKAGE_PREFIX}-opensubdiv"
  "${MINGW_PACKAGE_PREFIX}-openvdb"
  "${MINGW_PACKAGE_PREFIX}-openxr-sdk"
  "${MINGW_PACKAGE_PREFIX}-potrace"
  "${MINGW_PACKAGE_PREFIX}-pugixml"
  "${MINGW_PACKAGE_PREFIX}-python"
  "${MINGW_PACKAGE_PREFIX}-python-cattrs"
  "${MINGW_PACKAGE_PREFIX}-python-numpy"
  "${MINGW_PACKAGE_PREFIX}-sdl3"
  "${MINGW_PACKAGE_PREFIX}-tbb"
  "${MINGW_PACKAGE_PREFIX}-vulkan-loader"
  "${MINGW_PACKAGE_PREFIX}-zlib"
  "${MINGW_PACKAGE_PREFIX}-zstd"
)
makedepends=(
  "${MINGW_PACKAGE_PREFIX}-cc"
  "${MINGW_PACKAGE_PREFIX}-cmake"
  "${MINGW_PACKAGE_PREFIX}-ninja"
  "${MINGW_PACKAGE_PREFIX}-boost"
  "${MINGW_PACKAGE_PREFIX}-eigen3"
  "${MINGW_PACKAGE_PREFIX}-fmt"
  "${MINGW_PACKAGE_PREFIX}-vulkan-headers"
  "${MINGW_PACKAGE_PREFIX}-wintab-sdk"
  $([[ "$CARCH" == "aarch64" ]] && echo "${MINGW_PACKAGE_PREFIX}-sse2neon")
)
install=blender-${MSYSTEM}.install
source=(
  "https://download.blender.org/source/${_realname}-${pkgver}.tar.xz"
  'platform_win32_mingw64.cmake'
  'comctl_v6.exe.manifest'
  '0001-mingw-buildsystem.patch'
  '0002-fix-mingw-w64-definitions.patch'
  '0003-disable-static_assert_align-on-mingw.patch'
  '0004-fix-rad2-conflict.patch'
  '0005-fix-WINTAB_PRINTF-on-mingw.patch'
  '0006-mingw-DEBUG-avoid-too-many-sections.patch'
  '0008-mingw-use-X11-like-path-layout.patch'
  '0009-include-missing-headers.patch'
  '0010-conflict-near-far-macroses.patch'
  '0013-force-draco.patch'
  '0015-mingw-python-like-msvc.patch'
  '0016-mingw-windres.patch'
  '0019-fix-casts.patch'
  '0020-blendthumb-build.patch'
  '0022-find-llvm-convert-paths.patch'
  '0023-link-errors.patch'
  '0024-openvdb-shared.patch'
  '0025-callback-function-prototype-fix.patch'
  '0035-Enable-SSE2NEON-on-Windows-ARM.patch'
  '0039-no-WRL-on-mingw-w64.patch'
  '0040-wintab-msvc_try.patch'
  '0050-fix-vulkan-import-lib-lookup.patch'
)
sha256sums=('a5f99fc5fabf5062e661ca55d70987ae8f08d33324ac4865f133bbed7498d7bf'
            '1035df92f1e341ffc5096b1a6a7e099aa118da5b8165b0529e3b437f746f3469'
            '233b56fc38fe0aac714b0cfacdc8250dd64c1984d1a6785b9898a2d2c8a015ed'
            'dde4b1ede34e93f8ee9da76a68dc89f64d6c2e7a0607cf90711b3071cc330bbb'
            'a380c4737d7fce5df5edc1fa4fd4f54a72a5810a6326d64f4d6980d67c5f2dad'
            'c5bb37d878cf17a07f7cbc059e41c1336562dcb45aa03dbcb20c37468fa9b246'
            '66ef6b2ee5abac5aa92e00d66604897597772774eec3d67f063e360d6942d65c'
            'c671ee34e6cbd75daa6dd73d0c2d4b86ed5d894e50c2dfff8502a2ccdd9b2e86'
            '2422f3feed15706cf278f6705a36e9a85bc58f15f5437f93ca458193bbeebde4'
            '2f9769332cc970dcf2ccb6ebb26d75363f3e7e8960606bf1a379dd0991dfa2f4'
            '553df07f6a4646ada543ae66282f884bd645eeae6b77569d28d8aabbadf73123'
            '800d14890c2b6b85579387899760f2421ae1f75565bb970063ab032b41a4eeef'
            'd1690f3b19dc29c5306162630f2876c7d1472be40ff6689538ca72b864c4c296'
            '2375f98cbbbddff9b324c24e44906731816cd8f45abad4f7fd4fbff859fe84a8'
            'db1927ec5c98b4c92b28055c4f3d54bb76f3ba3c9dd639c5996eb13481866c28'
            'd6f07fa2aba173f72ef24b43680fec04d91e19572a9d3570727e6605f61b41d8'
            'c6d15990e23656d6c25c09dd5087ba3eee2d12ee55a7efa98dd9cc344d1da9d6'
            '6b47b42c18ae25e4ebe6406d51863ffae949f40232e0459b7dda7d88e47778ed'
            '84fe36c31c5f33e98153f4874aab0f1fb6aa66b137ac08bc9e5cfd7128da2e65'
            '0ecad0fb38b6d6e4575dd9036604885388454a2be2e9ab02b5f6663638ec8e7f'
            '8bfdc3d523793a7d1bf54768471bae9617fc14b19ac69c6abf5af80a6aaed76f'
            '38bfc1175e945c518b1a60314d11b7b35c18e45cf4e7c2e4916ba8347cec37ca'
            'bd9c45435b4f2f8ab1bbdb80e652f70a8d01265323170d707ac74c0e52ae4aa1'
            '0d57fef0d4ad5c608e15822d51a6b77f8721030b2a801eaa19d27ee642d9b9c3'
            '200082fcf47880d508bfa7c2c6c004102a8520c1d8ed87fd366fc75addf95c3e')
#options=(debug)

apply_patch_with_msg() {
  for _patch in "$@"
  do
    msg2 "Applying ${_patch}"
    patch -Nbp1 -i "${srcdir}/${_patch}"
  done
}

prepare() {
  cd "${_realname}-${pkgver}"
  cp -f "${srcdir}/platform_win32_mingw64.cmake" build_files/cmake/platform/
  
  cp -f "${srcdir}/comctl_v6.exe.manifest" release/windows/icons/blender.exe.manifest
  cp -f "${srcdir}/comctl_v6.exe.manifest" ./tests.exe.manifest

  apply_patch_with_msg \
    '0001-mingw-buildsystem.patch' \
    '0002-fix-mingw-w64-definitions.patch' \
    '0003-disable-static_assert_align-on-mingw.patch' \
    '0004-fix-rad2-conflict.patch' \
    '0005-fix-WINTAB_PRINTF-on-mingw.patch' \
    '0008-mingw-use-X11-like-path-layout.patch' \
    '0009-include-missing-headers.patch' \
    '0010-conflict-near-far-macroses.patch' \
    '0013-force-draco.patch' \
    '0015-mingw-python-like-msvc.patch' \
    '0016-mingw-windres.patch' \
    '0019-fix-casts.patch' \
    '0020-blendthumb-build.patch' \
    '0022-find-llvm-convert-paths.patch' \
    '0023-link-errors.patch' \
    '0024-openvdb-shared.patch' \
    '0025-callback-function-prototype-fix.patch' \
    '0035-Enable-SSE2NEON-on-Windows-ARM.patch' \
    '0039-no-WRL-on-mingw-w64.patch' \
    '0040-wintab-msvc_try.patch' \
    '0050-fix-vulkan-import-lib-lookup.patch'

  if check_option "debug" "y"; then
    apply_patch_with_msg \
      '0006-mingw-DEBUG-avoid-too-many-sections.patch'
  fi

  # Remove *.orig files
  find . -type f -name "*.orig" -exec rm -f {} \;
}

build() {
  mkdir -p "build-${MSYSTEM}"  && cd "build-${MSYSTEM}"

  declare -a _extra_config
  if check_option "debug" "n"; then
    _extra_config+=("-DCMAKE_BUILD_TYPE=Release")
  else
    _extra_config+=("-DCMAKE_BUILD_TYPE=Debug" "-DWITH_CYCLES_DEBUG=ON" "-DWITH_GHOST_DEBUG=ON" "-DWITH_DRAW_DEBUG=ON")
  fi

  CXXFLAGS+=" -w"
  CFLAGS+=" -w"
  if [[ "${CC}" == clang ]]; then
    CXXFLAGS+=" -Wno-c++11-narrowing"
    CFLAGS+=" -Wno-unreachable-code-generic-assoc"
  else
    CFLAGS+=" -Wno-incompatible-pointer-types"
  fi

  if [[ $CARCH == "aarch64" ]]; then
    _extra_config+=("-DSSE2NEON_ROOT_DIR=${MINGW_PREFIX}/include/sse2neon")
  fi

  export XR_OPENXR_SDK_ROOT_DIR="${MINGW_PREFIX}"
  export EMBREE_ROOT_DIR="${MINGW_PREFIX}"

  _pyver="$("${MINGW_PREFIX}/bin/python" -c "import sys;sys.stdout.write('.'.join(map(str, sys.version_info[:2])))")"

  CXXFLAGS+=" -D_USE_MATH_DEFINES" \
  MSYS2_ARG_CONV_EXCL="-DCMAKE_INSTALL_PREFIX=" \
  "${MINGW_PREFIX}/bin/cmake" \
    -G"Ninja" \
    -DCMAKE_INSTALL_PREFIX="${MINGW_PREFIX}" \
    "${_extra_config[@]}" \
    -Dfmt_SHARED_LIBS=ON \
    -DWITH_SYSTEM_AUDASPACE=ON \
    -DWITH_RUBBERBAND=OFF \
    -DWITH_SYSTEM_GFLAGS=ON \
    -DWITH_SYSTEM_GLOG=ON \
    -DWITH_SYSTEM_BULLET=OFF \
    -DWITH_SYSTEM_FREETYPE=ON \
    -DWITH_INSTALL_PORTABLE=OFF \
    -DWITH_NANOVDB=OFF \
    -DWITH_OPENCOLORIO=ON \
    -DWITH_CYCLES=ON \
    -DWITH_CYCLES_STANDALONE=ON \
    -DWITH_CYCLES_STANDALONE_GUI=ON \
    -DWITH_CYCLES_CUDA_BINARIES=OFF \
    -DWITH_CYCLES_OSL=ON \
    -DWITH_VULKAN_BACKEND=ON \
    -DWITH_MOD_OCEANSIM=ON \
    -DPYTHON_VERSION="${_pyver}" \
    -DPYTHON_LIBPATH="${MINGW_PREFIX}/lib" \
    -DPYTHON_LIBRARY="${MINGW_PREFIX}/lib/libpython${_pyver}.dll.a" \
    -DPYTHON_INCLUDE_DIR="${MINGW_PREFIX}/include/python${_pyver}" \
    -DWITH_PYTHON_INSTALL=OFF \
    -DWITH_PYTHON_INSTALL_NUMPY=OFF \
    -DGFLAGS_PREFER_EXPORTED_GFLAGS_CMAKE_CONFIGURATION=ON \
    "../${_realname}-${pkgver}"

  "${MINGW_PREFIX}/bin/cmake" --build .
}

package() {
  cd "build-${MSYSTEM}"

  DESTDIR="${pkgdir}" "${MINGW_PREFIX}/bin/cmake" --install .

  cp -r bin "${pkgdir}"${MINGW_PREFIX}/
  rm "${pkgdir}"${MINGW_PREFIX}/bin/msgfmt.exe

  # Manually install draco bindings
  #_pyver=$(${MINGW_PREFIX}/bin/python -c "import sys;sys.stdout.write('.'.join(map(str, sys.version_info[:2])))")
  #mkdir -p "${pkgdir}${MINGW_PREFIX}/lib/python${_pyver}"/
  #mv "${pkgdir}"${MINGW_PREFIX}/share/blender/5*/python/lib/* "${pkgdir}"${MINGW_PREFIX}/lib/
  #rm -r "${pkgdir}"${MINGW_PREFIX}/share/blender/5*/python

  "${MINGW_PREFIX}/bin/python" -m compileall -o 0 -o 1 -q "${pkgdir}${MINGW_PREFIX}/share/blender/${pkgver%.*}"
  "${MINGW_PREFIX}/bin/python" -m compileall -o 0 -o 1 -q \
    "${pkgdir}${MINGW_PREFIX}/share/blender/${pkgver%.*}/scripts/startup" \
    "${pkgdir}${MINGW_PREFIX}/share/blender/${pkgver%.*}/scripts/modules" \
    "${pkgdir}${MINGW_PREFIX}/share/blender/${pkgver%.*}/scripts/addons_core"

  install -dm755 "${pkgdir}${MINGW_PREFIX}/share/licenses/${_realname}/"
  for file in "${srcdir}/${_realname}-${pkgver}/doc/license/"*; do
    install -Dm644 "${file}" "${pkgdir}${MINGW_PREFIX}/share/licenses/${_realname}/"
  done
}
