#! /usr/bin/gawk -f # Last edited on 1999-02-13 16:21:12 by stolfi BEGIN { abort = -1; usage = ( \ "ring-make.awk \\\n" \ " < ring-props.txt \\\n" \ " > ring.incx" \ ); # Generates a POVRay declaration that defines an object called # ring_pebbles. For each pebble, reads a record with fields X Y Z SX # SY RSZ AGE GUN, and writes an instance of the object # "pebble_core_K_NN" where K is the GUN (0..2) and NN is the # particle's age (quantified to 0..15). # # Assumes that the objects "pebble_K_NN" have been defined previously pi = 3.1415926; twopi = 2*pi; printf "creating povray file...\n" > "/dev/stderr"; write_pov_header(); npb = 0; } (abort >= 0) { exit abort;} /./ { if (NF != 8) { file_error("bad format"); } x = $1; y = $2; z = $3; sx = $4; sy = $5; rsz = $6; age = $7; gun = $8; write_pebble(x,y,z, sx,sy, rsz,gun,age); npb++; next; } END{ write_pov_tailer(); printf "%d pebbles generated\n", npb > "/dev/stderr"; } function write_pov_header( k,nn) { printf "// Ring of pebbles\n"; printf "// Created by ring-povify.awk - DO NOT EDIT\n"; printf "\n"; printf "// Requires\n"; printf "// pebble_K_NN\n"; printf "// where K={0,1,2} NN={00..15}\n"; printf "// ring_pebble_size\n"; printf "// Defines\n"; printf "// ring\n"; printf "\n"; printf "#include \"pebbles.incx\"\n"; printf "\n"; printf "#declare psz = ring_pebble_size;\n"; printf "\n"; printf "#declare ring_pebbles = union{\n"; printf "\n"; } function write_pebble(x,y,z, sx,sy, rsz,gun,age, s,rz,ry) { # printf "#ifdef(pebble_%d_%02d)\n", gun, age; printf " object{pebble_%d_%02d scale %.3f*psz\n", gun, int(15*age + 0.5), rsz; if ((sx != 0) || (sy != 0)) { rz = (180/pi)*atan2(sy,sx); ry = (180/pi)*atan2(sqrt(sx*sx+sy*sy),1); printf " rotate <0,0,%.0f> rotate <0,%.0f,%.0f>\n", -rz, -ry, rz; } printf " translate <%+.3f,%+.3f,%+.3f>\n", x, y, z; printf " }\n"; # printf "#end\n"; printf "\n"; } function write_pov_tailer() { printf "}\n"; printf "// Done.\n"; } function file_error(msg) { printf "*** line %d: %s\n", NFR, msg > "/dev/stderr"; abort = 1; exit abort; } function arg_error(msg) { printf "*** %s\n", msg > "/dev/stderr"; abort = 1; exit abort; }