#!/bin/sh

# install_photogrammetry_env.deb.sh
# 2025-10-23
# by Gernot Walzl

# This script installs software used for photogrammetry. Tested on Debian 13.
# Installed software: COLMAP, OpenMVS, MeshLab, Blender.

COLMAP_DOCKERFILE_DOWNLOAD="https://gernot-walzl.at/Miscellaneous/Photogrammetry/colmap.Dockerfile"
OPENMVS_DEBBUILD_DOWNLOAD="https://gernot-walzl.at/Debian/DebBuilds/openmvs.DebBuild"

MESHLAB_VERSION="2025.07"
MESHLAB_APPIMG="MeshLab${MESHLAB_VERSION}-linux_x86_64.AppImage"
MESHLAB_DOWNLOAD="https://github.com/cnr-isti-vclab/meshlab/releases/download/MeshLab-${MESHLAB_VERSION}/${MESHLAB_APPIMG}"

BLENDER_VERSION="4.5.3"
BLENDER_ARCHIVE="blender-${BLENDER_VERSION}-linux-x64.tar.xz"
BLENDER_DOWNLOAD="https://download.blender.org/release/Blender4.5/${BLENDER_ARCHIVE}"

CWD=$(pwd)
TMP=${TMP:-'/tmp'}

install_colmap () {
  if [ ! -f colmap.Dockerfile ]; then
    wget -O colmap.Dockerfile "$COLMAP_DOCKERFILE_DOWNLOAD"
  fi

  apt-get update
  apt-get install docker.io

  docker build -o=output -f colmap.Dockerfile .

  mkdir -p /usr/local/bin
  cp output/usr/local/bin/colmap /usr/local/bin/colmap

  # https://github.com/colmap/colmap/blob/main/docker/Dockerfile#L66
  apt-get install \
    libboost-program-options1.83.0 \
    libomp5 \
    libopengl0 \
    libmetis5 \
    libceres4t64 \
    libfreeimage3 \
    libgcc-s1 \
    libgl1 \
    libglew2.2 \
    libqt6core6t64 \
    libqt6gui6 \
    libqt6widgets6 \
    libqt6openglwidgets6 \
    libcurl4t64 \
    libssl3t64 \
    libmkl-intel-lp64 \
    libmkl-intel-thread \
    libmkl-core \
    nvidia-cuda-toolkit

  rm -rf output
}

install_openmvs () {
  if [ ! -f openmvs.DebBuild ]; then
    wget -O openmvs.DebBuild "$OPENMVS_DEBBUILD_DOWNLOAD"
  fi

  chmod +x openmvs.DebBuild
  ./openmvs.DebBuild

  dpkg -i /tmp/openmvs_*_amd64.deb
}

install_meshlab () {
  if [ ! -f "$CWD/$MESHLAB_APPIMG" ]; then
    wget -O "$CWD/$MESHLAB_APPIMG" "$MESHLAB_DOWNLOAD"
  fi

  mkdir -p /opt
  cp "$CWD/$MESHLAB_APPIMG" /opt
  chown root:root "/opt/$MESHLAB_APPIMG"
  chmod +x "/opt/$MESHLAB_APPIMG"
  rm -f /usr/local/bin/meshlab
  ln -s "/opt/$MESHLAB_APPIMG" /usr/local/bin/meshlab

  # rm "$CWD/$MESHLAB_APPIMG"
}

install_blender () {
  if [ ! -f "$CWD/$BLENDER_ARCHIVE" ]; then
    wget -O "$CWD/$BLENDER_ARCHIVE" "$BLENDER_DOWNLOAD"
  fi

  cd "$TMP" || return 1
  tar xvf "$CWD/$BLENDER_ARCHIVE"
  mkdir -p /opt
  rm -rf "/opt/blender-${BLENDER_VERSION}"
  mv "blender-${BLENDER_VERSION}-linux-x64" "/opt/blender-${BLENDER_VERSION}"
  rm -f /usr/local/bin/blender
  ln -s "/opt/blender-${BLENDER_VERSION}/blender" /usr/local/bin/blender

  # rm "$CWD/$BLENDER_ARCHIVE"
}

if [ "$(id -u)" != "0" ]; then
  echo "This script must be run as root."
  exit 1
fi
install_colmap
install_openmvs
install_meshlab
install_blender