#!/bin/sh

#       2014-12-18 Now uses GIANT_DATA_DIR instead of BIO_DATA_DIR if it is
#                  set.
# 0.1.0 2011-06-10 Added version number.
#       2010-06-25 Fixed problem with absolute paths for the model in the
#                  resulting anm.

data_dir=${GIANT_DATA_DIR%/}
data_dir_var=GIANT_DATA_DIR

if [ "$data_dir" = "" ]; then
  data_dir=${BIO_DATA_DIR%/}
  data_dir_var=BIO_DATA_DIR
fi


if [ $# != 4 ] ; then
  echo
  echo "mkprop 0.1.0"
  echo
  echo "Usage: mkprop <model name> <probspec name> <marker count> <scale factor>"
  echo
  exit 1
fi

modelname=$1
probspec_name=`basename $2 .psp`
nmarkers=$3
scale=$4

target_dir=$data_dir/anim/target

if [ ! -d $target_dir ]; then
  echo "Missing directory $target_dir"
  exit 1
fi

full_path_name() {
  if [ "${1#/}" = "$1" ]; then
    # No leading /
    # must be an easier way to do this
    cwd=`pwd`
    dn=`dirname "$1"`
    cd "$dn"
    dir=`/bin/pwd`
    cd "$cwd"
    echo "$dir"/`basename "$1"`
  else
    # Has a leading /
    echo "$1"
  fi
}


if [ ! -f "$modelname" ]; then
  echo "File does not exist: $modelname"
  exit 1
fi

echo "modelname: $modelname"
modelname=`full_path_name "$modelname"`
echo "Full path modelname: $modelname"
mkdir `dirname "$modelname"`/$probspec_name
renamedmdl=`dirname "$modelname"`/$probspec_name/$probspec_name.mdl
renamedmdl=`echo "$renamedmdl" | sed 's/ /_/'`

echo "Creating $renamedmdl"
awk '
  $1=="NAME:" || $1=="BODY:" || $1=="VERTICES:" || $1=="MATERIAL:" ||
  $1=="PARENT_NAME:" {
    sub(".*:","",$2)
  }
  { print }
' <"$modelname" >$renamedmdl || exit 1

echo "Scaling model"
mdlutil scale $scale $renamedmdl $renamedmdl.$$ || exit 1
mv $renamedmdl.$$ $renamedmdl || exit 1

getbodies() {
  awk '
    BEGIN { depth=0 }
    $2=="{" {
      ++depth;
    }
    $1=="BODY" && depth==1 {
      inbody=1;
      next;
    }
    $1=="}" {
      --depth;
      if (inbody && depth==0) {
        if (parent_name=="GLOBAL") {
          print name
        }
        inbody=0;
      }
      next;
    }
    $1=="NAME:" { name = $2 }
    $1=="PARENT_NAME:" { parent_name = $2 }
  ' <$1
}
echo "Probespec name: $probspec_name"
probdefdir=$data_dir/probspec/props/$probspec_name

mkdir $probdefdir
probdef=$probdefdir/$probspec_name.pdf
bodydef=$probdefdir/$probspec_name.bdf
limits=$probdefdir/$probspec_name.lmt
scaledef=$probdefdir/$probspec_name.sdf
probspec=$data_dir/probspec/props/$probspec_name.psp
charmap=$data_dir/charmap/props/$probspec_name.cm
anim=$target_dir/props/$probspec_name.anm
mapping=$data_dir/dof/$probspec_name.dof

bodies=`getbodies $renamedmdl`
nbodies=`echo $bodies | wc -w`
nbodies=`expr $nbodies + 0`
if [ $nbodies != 1 ]; then
  echo "Body count in model is $nbodies instead of 1"
  exit 1
fi
body=$bodies
echo "Using body $body"

echo "Creating $probdef"
(
echo "Bio Problem Definition File"
echo "v1.00"
echo "  6     # of variables, var num, lim type, description"
echo "    1    $body X Translation"
echo "    2    $body Y Translation"
echo "    3    $body Z Translation"
echo "    4    $body X Rotation"
echo "    5    $body Y Rotation"
echo "    6    $body Z Rotation"
echo "  1    # of bodies, body names, parent names, graphics #, type"
printf " \"%s\" ReferenceSystemZero        1   0\n" $body
echo "    1   2   3   4   5   6"
echo "   1"
echo "   2"
echo "   3"
echo "   4"
echo "   5"
echo "   6"
echo "  $nmarkers    # real points, point#, pred type #, weight, body name"
marker=1
while [ $marker -le $nmarkers ]; do
  printf "%4d   4   2.000    \"%s\" \n" $marker $body
  marker=`expr $marker + 1`
done
echo "  0    # fix points, point#, weight, body name"
echo "  0    # double points, point #, double #, weight, body name"
echo "  0    # artificial pairs, pt1#, pt2#, weight, body1 name, body2 name"
) >$probdef

echo "Creating $bodydef"
(
echo "Bio Model File"
echo "v1.00"
echo "0    ; # of cameras"
echo "1    ; #  of bodies"
echo " $body"
echo "  1.000000    0.000000    0.000000"
echo "  0.000000    1.000000    0.000000"
echo "  0.000000    0.000000    1.000000"
echo "  0.000000    0.000000    0.000000"
echo "$nmarkers    ; # of real points"
marker=1
while [ $marker -le $nmarkers ]; do
  xpos=`expr $marker \* 10`
  echo "  $marker   $xpos   0   0"
  marker=`expr $marker + 1`
done
echo "0    ; # of fixed points "
echo "0    ; # of double points"
echo "0    ; # of artificial pairs"
) >$bodydef.temp

updatebdf $bodydef.temp $probdef $renamedmdl $bodydef || exit 1

rm $bodydef.temp

echo "Creating $limits"
(
echo "Bio System Variable Limits File"
echo "v2.00"
) >$limits

echo "Creating $scaledef"
(
echo "Bio Scale Definition File"
echo "v1.00"
echo "REAL_COUNT: $nmarkers"
echo "DEFAULT_REAL_WEIGHT: 1.00"
echo "REAL_WEIGHT_OVERRIDES {"
echo "}"
echo "ARTIFICIAL_PAIR_WEIGHT_OVERRIDES {"
echo "}"
echo "LIMIT_ADJUSTMENTS {"
echo "}"
echo "SCALING_VARIABLES {"
echo "}"
echo "BODY_SCALINGS {"
echo "}"
echo "GLOBAL_CONSTRAINTS {"
echo "}"
echo "TEMPS {"
echo "}"
) >$scaledef

subenv() {
  fn=${1#$data_dir/} # replace substring equal to the
                     # value of the workspace directory with the
                     # workspace variable

  if [ x"$fn" != x"$1" ] ;then
    echo '$'$data_dir_var'/'$fn
  else
    echo $fn
  fi
}

echo "Creating $probspec"
(
echo "Bio Problem Specification File"
echo "v1.00"
echo 'MODEL: '`subenv $renamedmdl`
echo 'PROBDEF: '`subenv $probdef`
echo 'UNSCALEDBODYDEF: '`subenv $bodydef`
echo 'SCALEDEF: '`subenv $scaledef`
echo 'LIMITS: '`subenv $limits`
echo 'SEARCHPARAMETERS: $'$data_dir_var'/probspec/body.sch'
echo 'Match: BodyName'
) >$probspec

echo "Creating $charmap"
(
echo "Bio Character Map File"
echo "v1.00"
echo "COPY_MOTION {"
echo "  BODY {"
echo "    TARGET: $body"
echo "    EXPR {"
echo "      INTERACTIVE {"
echo "        TYPE: pos"
echo "        SOURCE_BODY: $body"
echo "        SOURCE_POSITION {"
echo "          X: 0"
echo "          Y: 0"
echo "          Z: 0"
echo "        }"
echo "        TARGET_POSITION {"
echo "          X: 0"
echo "          Y: 0"
echo "          Z: 0"
echo "        }"
echo "        OFFSET {"
echo "          COORDINATE_SYSTEM: Global"
echo "          X: 0"
echo "          Y: 0"
echo "          Z: 0"
echo "        }"
echo "        GLOBAL_SCALING_PERCENT: 100"
echo "        DISABLED: NO"
echo "        PASS_THROUGH_LATTICE: YES"
echo "      }"
echo "      INTERACTIVE {"
echo "        TYPE: orient"
echo "        SOURCE_BODY: $body"
echo "        SOURCE_ORIENTATION {"
echo "          X: 0"
echo "          Y: 0"
echo "          Z: 0"
echo "        }"
echo "        TARGET_ORIENTATION {"
echo "          X: 0"
echo "          Y: 0"
echo "          Z: 0"
echo "        }"
echo "        GLOBAL_OFFSET {"
echo "          X: 0"
echo "          Y: 0"
echo "          Z: 0"
echo "        }"
echo "        TARGET_AXIS_MAPPING: X Y Z"
echo "        DISABLED: NO"
echo "        DEFORMER {"
echo "          PASS_THROUGH: YES"
echo "          PRESERVE_TILT: YES"
echo "        }"
echo "      }"
echo "    }"
echo "  }"
echo "}"
) >$charmap

echo "Creating $mapping"
(
echo "Bio Graphic Mapping File"
echo "v1.0"
echo "6"
echo "1"
echo "1"
echo "1 2 3 4 5 6"
echo "1"
echo "2"
echo "3"
echo "4"
echo "5"
echo "6"
) >$mapping

echo "Creating $anim"
(
echo "Bio Animation File"
echo "v1.00"
echo "MODEL: `subenv $renamedmdl`"
echo "MAPPING: `subenv $mapping`"
) >$anim
