#!/bin/sh
#
#	Raster3D utility script "stereo3d" V3.0.3
#       =========================================
#
# Ethan A Merritt - May 2011
#
# Renders a single Raster3D scene description as a side-by-side stereo pair.
# By default this version of the stereo3d script uses a shear operation to 
# make the left/right images.  The -angsep option causes it to use angular 
# separation instead. In this case the angular separation is pre-set to 
# +/- 2.5 degrees.  If you want some other value you can edit the script.
# Neither shear nor rotation is perfect; relative weak points are shown
# in this table:
#                               shear           rotation
#                               -----           --------
#    Z-clipping                 OK              serious problem
#    specular highlights        OK              minor problem
#    Bounding planes            bad             OK
#    shadows                    bad (fixable?)  OK
#
#
# Requires:
#	ImageMagick utilities identify, mogrify, and montage.
# 	sed (previous versions used awk/nawk).
# This script was tested using ImageMagick version 6.6.1
#
# Usage:
#	stereo3d [-angsep] [-border] [-png  [out.png]] < infile.r3d > outfile.png
#
# Temporary files:
#	Scratch files are put in $TMPDIR, if it exists, else in /tmp
#

#
# Construct base name for scratch files
#
if [ "$TMPDIR" ]; then
    tmp=$TMPDIR/$$
elif [ -d /usr/tmp ]; then
    tmp=/usr/tmp/$$
else
    tmp=/tmp/$$
fi
# echo "DEBUG scratch files to $tmp"  1>&2

#
# Parse command line options
#
unset STEREOBORDER
unset outfile
unset img
mode=
previous=
render_options=
normal_options=

for option in $*
do
if   [ "$option" = "-border" ]; then STEREOBORDER=1; 
elif [ "$option" = "-png"    ]; then img=png; 
elif [ "$option" = "-tiff"   ]; then img=tiff; 
elif [ "$option" = "-angsep" ]; then mode="-ang 2.5"; 
else
    if [ "$previous" = "-tiff" ] || [ "$previous" = "-png" ] ; then
    	outfile="$option"
	if [ `echo "$option" | sed -e 's/\(.\).*/\1/'` != "-" ]; then
	    outfile="$option"
	fi
    elif [ "$previous" = "-size" ] ; then
    	normal_options="${normal_options} -size $option"
    	render_options="${render_options} $option"
    else
	render_options="${render_options} $option"
    fi
fi
previous="$option"
done

if [ "$img" != "tiff" ]; then
    img=png
fi

if [ "$outfile" ]; then
    echo "stereo3d: $img output to $outfile" 1>&2
else
    echo "stereo3d: $img output to stdout" 1>&2
fi

#
# Call normal3d to create left/right pair of input descriptions
# Default is to use a shear operation to create stereo effect
# -angsep selects angular separation instead

if normal3d -stereo ${tmp} -expand $mode ${normal_options} > ${tmp}_stereo3d.tmp 
then
    echo "stereo3d: normal3d seems to be OK" 1>&2
else
    echo "stereo3d: normal3d failed" 1>&2
    exit -1
fi

echo "@${tmp}_stereo3d.tmp" >> ${tmp}_left.r3d
echo "@${tmp}_stereo3d.tmp" >> ${tmp}_right.r3d

#
# Render left and right panels separately
# Old code (without label processing) was
#    render -tiff left.tiff  < left.r3d
#    render -tiff right.tiff < right.r3d
#
# echo " normal3d options $normal_options" 1>&2
# echo " render options $render_options" 1>&2
echo "stereo3d: rendering left eye view" 1>&2
render ${render_options} -${img}  ${tmp}_left.${img} < ${tmp}_left.r3d  2> /dev/null
echo "stereo3d: rendering right eye view" 1>&2
render ${render_options} -${img} ${tmp}_right.${img} < ${tmp}_right.r3d  2> /dev/null
#
# Find image size
IMAGESIZE=`identify ${tmp}_left.${img} | sed -e 's/.* \([0-9]*x[0-9]*\).*/\1/'`
WIDTH=`echo $IMAGESIZE | sed -e 's/x.*//'`
HEIGHT=`echo $IMAGESIZE | sed -e 's/.*x//'`
IMAGESIZE=`echo "$WIDTH x $HEIGHT" | sed -e 's/ //g'`

#
echo "stereo3d: joining left and right images" 1>&2
if [ "$STEREOBORDER" ]; then
   montage +frame +label -background black -geometry $IMAGESIZE+2+0! -scenes 0 ${tmp}_left.${img} ${tmp}_right.${img} ${tmp}_stereo3d.${img}
else
   montage +frame +label -background white -geometry $IMAGESIZE+0+0! -scenes 0 ${tmp}_left.${img} ${tmp}_right.${img} ${tmp}_stereo3d.${img}
fi
#
# This next bit is only necessary because ImageMagick _always_ writes a label
# field at the bottom of the picture. Even with a font size of 0, you still get
# two extra rows of pixels at the bottom. So we crop back to the original height.
#
if [ "$STEREOBORDER" ]; then
   echo "stereo3d: adding border" 1>&2
   NEWWIDTH=`identify ${tmp}_stereo3d.${img} | sed -e 's/.* \([0-9]*\)x[0-9]*.*/\1/'`
   IMAGESIZE=`echo "$NEWWIDTH x $HEIGHT" | sed -e 's/ //g'`
   mogrify -crop $IMAGESIZE+0+0 -bordercolor black -border 2x4 ${tmp}_stereo3d.${img}
fi
echo "Stereo image size $IMAGESIZE" 1>&2

#
# output to explicit file or to stdout
#
if [ "$outfile" ]; then
   mv  ${tmp}_stereo3d.${img} $outfile
else
   cat ${tmp}_stereo3d.${img}
fi

#
# clean up
#
rm -f ${tmp}_left.r3d ${tmp}_right.r3d ${tmp}_stereo3d.tmp
rm -f ${tmp}_left.${img} ${tmp}_right.${img} ${tmp}_stereo3d.${img}