Sprout/tools/darkroom/darkcult.sh

208 lines
6 KiB
Bash
Raw Normal View History

#!/bin/bash
# =============================================================================
# Copyright (c) 2011-2013 Bolero MURAKAMI
# https://github.com/bolero-MURAKAMI/Sprout
#
# Distributed under the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
# =============================================================================
#
# requires: Netpbm (http://netpbm.sourceforge.net/)
#
2013-09-19 17:40:19 +00:00
src="../../example/darkroom/two_spheres.hpp"
stagedir="darkroom"
2013-09-23 11:53:01 +00:00
output="out.ppm"
2013-09-23 12:10:58 +00:00
compiler="g++"
width=16
height=16
tile_width=16
tile_height=16
declare -a user_macros
user_macros=()
declare -a include_paths
include_paths=()
max_procs=1
force=0
2013-09-23 09:56:57 +00:00
use_help=0
darkcult_cpp=$(cd $(dirname $0); pwd)/darkcult.cpp
darkcult_py=$(cd $(dirname $0); pwd)/darkcult.py
args=`getopt -o s:S:o:C:w:h:W:H:D:I:P:f -l source:,stagedir:,output:,compiler:,width:,height:,tile-width:,tile-height:,define:,include:,max-procs:,force,help -- "$@"`
if [ "$?" -ne 0 ]; then
2013-09-24 01:05:47 +00:00
echo >&2 "error: options parse error. See 'darkcult.sh --help'"
exit 1
fi
eval set -- ${args}
while [ -n "$1" ]; do
case $1 in
-s|--source) src=$2; shift 2;;
2013-09-20 07:38:27 +00:00
-S|--stagedir) stagedir=$2; shift 2;;
2013-09-23 11:53:01 +00:00
-o|--output) output=$2; shift 2;;
2013-09-23 12:10:58 +00:00
-C|--compiler) compiler=$2; shift 2;;
-w|--width) width=$2; shift 2;;
-h|--height) height=$2; shift 2;;
-W|--tile-width) tile_width=$2; shift 2;;
-H|--tile-height) tile_height=$2; shift 2;;
-D|--define) user_macros=(${user_macros[@]} "$2"); shift 2;;
-I|--include) include_paths=(${include_paths[@]} "$2"); shift 2;;
-P|--max_procs) max_procs=$2; shift 2;;
2013-09-19 16:39:16 +00:00
-f|--force) force=1; shift;;
2013-09-23 09:56:57 +00:00
--help) use_help=1; shift;;
--) shift; break;;
2013-09-23 09:56:57 +00:00
*) echo >&2 "error: unknown option($1) used."; exit 1;;
esac
done
2013-09-23 09:56:57 +00:00
if [ ${use_help} -ne 0 ]; then
echo "help:"
echo ""
echo " -s, --source=<file> Indicates the source file."
2013-09-23 11:53:01 +00:00
echo " Default; '../../example/darkroom/two_spheres.hpp'"
2013-09-23 09:56:57 +00:00
echo ""
echo " -S, --stagedir=<dir> Output files here."
2013-09-23 11:53:01 +00:00
echo " Default; 'darkroom'"
echo ""
echo " -o, --output=<file> Output file of the result."
echo " Default; 'out.ppm'"
2013-09-23 09:56:57 +00:00
echo ""
2013-09-23 12:10:58 +00:00
echo " -C, --compiler=<command> Compiler to use."
echo " Default; 'g++'"
echo ""
2013-09-23 09:56:57 +00:00
echo " -w, --width=<value> Output width of rendering."
echo " Default; 16"
echo ""
echo " -h, --height=<value> Output height of rendering."
echo " Default; 16"
echo ""
echo " -W, --tile-width=<value> Output width of divided rendering."
echo " Default; 16"
echo ""
echo " -H, --tile-height=<value> Output height of divided rendering."
echo " Default; 16"
echo ""
echo " -D, --define=<identifier> Define macro for preprocessor."
echo ""
echo " -I, --include=<dir> Add system include path."
2013-09-23 09:56:57 +00:00
echo ""
echo " -P, --max-procs=<value> The maximum number of process use."
echo " Default; 1"
echo ""
2013-09-23 09:56:57 +00:00
echo " -f, --force Allow overwrite of <stagedir>."
echo ""
echo " --help This message."
exit 0
fi
echo "settings:"
2013-09-23 12:10:58 +00:00
echo " source = '${src}'"
echo " stagedir = '${stagedir}'"
echo " output = '${output}'"
echo " compiler = '${compiler}'"
2013-09-23 09:56:57 +00:00
echo " width = ${width}"
echo " height = ${height}"
echo " tile-width = ${tile_width}"
echo " tile-height = ${tile_height}"
if [ ${#user_macros[*]} -gt 0 ]; then
2013-09-23 09:56:57 +00:00
echo " user-macros = (${user_macros[*]})"
fi
if [ ${#include_paths[*]} -gt 0 ]; then
2013-09-23 09:56:57 +00:00
echo " include-paths = (${include_paths[*]})"
fi
echo " max-procs = ${max_procs}"
2013-09-23 09:56:57 +00:00
echo " force = ${force}"
2013-09-19 17:40:19 +00:00
if [ ! -f "${src}" -a ! -f "$(cd $(dirname $0); pwd)/${src}" ]; then
2013-09-23 09:56:57 +00:00
echo >&2 "error: source(${src}) not exists."
exit 1
fi
if [ -d "${stagedir}" ]; then
if [ ${force} -eq 0 ]; then
2013-09-23 09:56:57 +00:00
echo >&2 "error: stagedir(${stagedir}) already exists."
exit 1
else
rm -f -r ${stagedir}/*
fi
else
mkdir -p ${stagedir}
fi
for user_macro in ${user_macros}; do
define_options="${define_options} -D${user_macro}"
done
for include_path in ${include_paths}; do
include_options="${include_options} -I${include_path}"
done
for ((y=0; y<height; y+=tile_height)); do
mkdir -p ${stagedir}/${y}/
done
compile_options="-std=c++11 ${define_options} ${include_options}"
2013-09-23 11:53:01 +00:00
echo "rendering:"
2013-09-20 07:38:27 +00:00
start=${SECONDS}
if [ ${max_procs} -eq 1 ]; then
for ((y=0; y<height; y+=tile_height)); do
echo " y = (${y}/${height})..."
y_start=${SECONDS}
echo -n " x = "
for ((x=0; x<width; x+=tile_width)); do
echo -n "(${x}/${height})..."
binname=${y}/${x}.out
bin=${stagedir}/${binname}
${compiler} -o ${bin} \
${compile_options} \
-DDARKROOM_SOURCE="\"${src}\"" \
-DDARKROOM_TOTAL_WIDTH=${width} -DDARKROOM_TOTAL_HEIGHT=${height} \
-DDARKROOM_TILE_WIDTH=${tile_width} -DDARKROOM_TILE_HEIGHT=${tile_height} \
-DDARKROOM_OFFSET_X=${x} -DDARKROOM_OFFSET_Y=${y} \
${darkcult_cpp}
if [ $? -ne 0 ]; then
echo ""
echo >&2 "error: compile(${binname}) failed."
exit 1
fi
${bin} > ${stagedir}/${y}/${x}.ppm
done
echo ""
let "y_elapsed=${SECONDS}-${y_start}"
echo " elapsed = ${y_elapsed}s"
2013-09-20 07:38:27 +00:00
done
else
echo " processing in parallel mode."
echo -n " "
python "${darkcult_py}" \
"${src}" "${stagedir}" "${output}" "${compiler}" \
"${width}" "${height}" \
"${tile_width}" "${tile_height}" \
"${compile_options}" "${darkcult_cpp}" \
"${max_procs}"
if [ $? -ne 0 ]; then
echo ""
echo >&2 "error: compile failed."
exit 1
fi
2013-09-23 11:53:01 +00:00
echo ""
fi
let "elapsed=${SECONDS}-${start}"
echo " elapsed(total) = ${elapsed}s"
2013-09-23 11:53:01 +00:00
for ((y=0; y<height; y+=tile_height)); do
2013-09-20 07:38:27 +00:00
pushd ${stagedir}/${y}/ > /dev/null
# convert +append $(ls *.ppm | sort -n) ../${y}.ppm
pnmcat -lr $(ls *.ppm | sort -n) > ../${y}.ppm
2013-09-20 07:38:27 +00:00
popd > /dev/null
done
pushd ${stagedir} > /dev/null
2013-09-23 11:53:01 +00:00
#convert -append $(ls *.ppm | sort -n) ${output}
pnmcat -tb $(ls *.ppm | sort -n) > ${output}
2013-09-20 07:38:27 +00:00
popd > /dev/null
2013-09-23 09:56:57 +00:00
echo "finished."