# 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.1.1
pkgrel=1
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" It builds an internal library
         "${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}-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-numpy"
         "${MINGW_PACKAGE_PREFIX}-SDL2"
         "${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
        0028-use-std-namespace.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=('fae57dd7273d76e21712abfba43a85fffba00e8bf3e3cf9a874b993b8ac4857d'
            '22adff92a40e38efc50ea8c857af2f1467d71c4a716161f7e702a584d514e02c'
            '233b56fc38fe0aac714b0cfacdc8250dd64c1984d1a6785b9898a2d2c8a015ed'
            '5db6ed8efa380efd20735e2dd38b7490c41b2357b16c521be221e9f9b017e334'
            'bfbcc3e9e7bdfb53fe9e94c022665cb21b508105e44334fc62ab23d47fd877e5'
            '35b87402d710cc5b571df0a2248c43d46ae1693ca1af7447322314e27c96f4b1'
            '2182f683c446d34b18ee169bb55834d43ca7f7e817f592e53133bd0c85cec3f7'
            'c671ee34e6cbd75daa6dd73d0c2d4b86ed5d894e50c2dfff8502a2ccdd9b2e86'
            '2422f3feed15706cf278f6705a36e9a85bc58f15f5437f93ca458193bbeebde4'
            '2f9769332cc970dcf2ccb6ebb26d75363f3e7e8960606bf1a379dd0991dfa2f4'
            '5a06a1e7dd091edca77d8ba794d2405c7523b43a7cf9575179dc65dd24a78261'
            '2b4b5fe393997959c85502de2ca590b20aa020d4ca62768ece83c1ced4cc1a62'
            'e193ef6fb88a5de4334e992ab3ca0f87eebaa1e8aebb66f216004907a252dc19'
            '2375f98cbbbddff9b324c24e44906731816cd8f45abad4f7fd4fbff859fe84a8'
            'db1927ec5c98b4c92b28055c4f3d54bb76f3ba3c9dd639c5996eb13481866c28'
            'd6f07fa2aba173f72ef24b43680fec04d91e19572a9d3570727e6605f61b41d8'
            'c6d15990e23656d6c25c09dd5087ba3eee2d12ee55a7efa98dd9cc344d1da9d6'
            '6b47b42c18ae25e4ebe6406d51863ffae949f40232e0459b7dda7d88e47778ed'
            '99be1dd04ba9d943bf65485eba204384394b4149620c8f7022486a9f39cdda30'
            '0ecad0fb38b6d6e4575dd9036604885388454a2be2e9ab02b5f6663638ec8e7f'
            '8bfdc3d523793a7d1bf54768471bae9617fc14b19ac69c6abf5af80a6aaed76f'
            'd0fc87c54b63ae26e9fe131142a22cb9a362625a544bf267d462def93caef7b2'
            '38bfc1175e945c518b1a60314d11b7b35c18e45cf4e7c2e4916ba8347cec37ca'
            '7dc8d6f3069de04ce3cf2f55fc2b034754246e06e6f0e4bc541e9837e02ee086'
            '0d57fef0d4ad5c608e15822d51a6b77f8721030b2a801eaa19d27ee642d9b9c3'
            '200082fcf47880d508bfa7c2c6c004102a8520c1d8ed87fd366fc75addf95c3e')
#options=(debug)

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

prepare() {
  cd "${srcdir}"/${_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 \
    0028-use-std-namespace.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 "${srcdir}"/build-${MSYSTEM}  && cd "${srcdir}"/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 "${srcdir}"/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
}
