# 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/mingw64"
# 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.6m" -DPYTHON_INCLUDE_DIRS=/msys64/mingw64/include/python3.6m -DWITH_PYTHON_INSTALL=OFF -DWITH_PYTHON_INSTALL_NUMPY=OFF -DPYTHON_NUMPY_PATH=%MINGW_PREFIX%/lib/python3.6/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=4.4.3
pkgrel=3
pkgdesc="A fully integrated 3D graphics creation suite (mingw-w64)"
arch=('any')
mingw_arch=('mingw64' '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"
         "${MINGW_PACKAGE_PREFIX}-boost-libs"
         #"${MINGW_PACKAGE_PREFIX}-bullet-dp"
         #"${MINGW_PACKAGE_PREFIX}-draco" It builds an internal library
         "${MINGW_PACKAGE_PREFIX}-embree"
         "${MINGW_PACKAGE_PREFIX}-cc-libs"
         "${MINGW_PACKAGE_PREFIX}-gmp"
         "${MINGW_PACKAGE_PREFIX}-ffmpeg"
         "${MINGW_PACKAGE_PREFIX}-fftw"
         "${MINGW_PACKAGE_PREFIX}-freetype"
         #"${MINGW_PACKAGE_PREFIX}-gflags"
         #"${MINGW_PACKAGE_PREFIX}-glog"
         "${MINGW_PACKAGE_PREFIX}-glslang"
         "${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}-materialx"
         #"${MINGW_PACKAGE_PREFIX}-usd"
         "${MINGW_PACKAGE_PREFIX}-omp"
         "${MINGW_PACKAGE_PREFIX}-openal"
         "${MINGW_PACKAGE_PREFIX}-opencollada"
         "${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}-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
        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
        0011-no-TIME_UTC-on-msvcrt.patch
        0013-force-draco.patch
        0014-fix-find-numpy-2.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
        0032-fix-finding-tbb.patch
        0035-Enable-SSE2NEON-on-Windows-ARM.patch
        0039-no-WRL-on-mingw-w64.patch
        0050-fix-vulkan-import-lib-lookup.patch
        f4ad7267342bb4eb46bc6d384f4a28d10d251978.patch)
sha256sums=('99ecdef24ece14084016ee47c756eeb2fc8a09c8487a0296b45a117224dc5ca7'
            'f5765c9a5fc48b67a3eafde91dd6205e9979da0e0b582f6164b320403ef4cbf9'
            'c966881b7f4a87899e9aa9e56df434d8b8a5b138704f0605098aef28e457a853'
            '42e40277a5d86aa48eff922c90d15d2130dc80af9f2b8aed6f7269382354cb6e'
            'd6618a9004122b16bf6f27274cd6010d63abdf9fc1c3b5479d25ea5b50628f4b'
            '5a07eb6d4f9a0e7031551ede64e9359e8ebf6fc53c72579307e5016db95ff164'
            'e250fd0a992653e36b66db3f6c3708e6b6aab6513485e2813b869857307a14f2'
            'ce6f038a670be98ec1b79ef69fd716df733218c6c8b5d12dc1f13c2bb3c3e30e'
            '86aa99b789302506d1e0d74bf7dcac6ca9315aca816df3ca75fb1c3644ce15ea'
            '2d1cd06ed4d795b2341c9e8828350e29adb16fca43b30a7c644a1c7ac043c16e'
            'd4220bf1fa06b206c21b84e50febde42c2be88de68548ef208c34108ed545d8d'
            'e018b7ee07f7b8b4964fd30feb0495101d0a6b51f218652d12ae2b6369d495eb'
            '1d10ff80d5c16976c979ec507be01ac6d52f3ca1f5efd6ae3c5920e7ca3ebdc3'
            '06444eeb84d61437527d402c376024a862e60766963273868d76c604185829d1'
            '54f2569620eca6a6ad9e628a523a44bcddf96d863b749354f8bc5dd324dabeac'
            '7fb85035446d17b2b4f153af9591b0e4a7d005b42e4659a73524e1ee983c2f5e'
            '9627c4770142299b7c4717ee0fd1a4eaafc3ff51645c1cd9d07cd5aadd1a8962'
            '2e4d1f7ac01b6252b92e29c13cc00b1cd1445823f21da40d3802885512a648fe'
            '4e51f95af6999f64fac53691b2ea8a35dc59a019df9797bcea144172b3c54bd9'
            'a305329b31d2c04dc8944cd55ea6abd7333cf8c3515a04c242d567125db27caf'
            'c39bfb8c5e4f6d26601e9cb03b979265ff0bbbcb2d2758005a4d0b0ed9616c7f'
            '37927b5a4e93461343841c84bdd1c67755bd03ac14d454ad8f4a952c37049ff7'
            'bc27e13a2066fa5172bc02b580877f3d7914d4ced8842f0a8c8ed09a05844039'
            '2e0a36de42e2741122e7ab5e8895508a71d0b0db460d19013ab2424d29b52553'
            '8e8e8fc235ecccdacf775e30b7bffcf67749d78e1961710a48d40d06c7a12702'
            '4f501f1dea6a6c09d1548f45d4d0b19a757170ab9a3396ce125fa62949c4e2f9'
            '74abe05319d5f385e4f3e1206543613237ce8dfb7f6b8dd14bc73c84831f1e4e'
            'c5e205e23b56185202cdf7bd98184812ad10e8b124dbb2ceae8429d50339ecf8')
#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/

  rm -f release/windows/icons/blender.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 \
    0011-no-TIME_UTC-on-msvcrt.patch \
    0013-force-draco.patch \
    0014-fix-find-numpy-2.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 \
    0032-fix-finding-tbb.patch \
    0035-Enable-SSE2NEON-on-Windows-ARM.patch \
    0039-no-WRL-on-mingw-w64.patch \
    0050-fix-vulkan-import-lib-lookup.patch \
    f4ad7267342bb4eb46bc6d384f4a28d10d251978.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 [[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]]; then
    CXXFLAGS+=" -Wno-c++11-narrowing"
    CFLAGS+=" -Wno-unreachable-code-generic-assoc"
  fi

  if [[ $MINGW_PACKAGE_PREFIX != *-clang-* ]]; then
    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[@]}" \
    -DWITH_SYSTEM_AUDASPACE=ON \
    -DWITH_SYSTEM_GFLAGS=OFF \
    -DWITH_SYSTEM_GLOG=OFF \
    -DWITH_SYSTEM_BULLET=OFF \
    -DWITH_SYSTEM_LZO=ON \
    -DWITH_SYSTEM_EIGEN3=ON \
    -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_MEM_JEMALLOC=OFF \
    -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 \
    -DWITH_OPENMP=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/4*/python/lib/* "${pkgdir}"${MINGW_PREFIX}/lib/
  #rm -r "${pkgdir}"${MINGW_PREFIX}/share/blender/4*/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
}
