| /*************************************************************************/ |
| /* */ |
| /* Copyright (c) 1994 Stanford University */ |
| /* */ |
| /* All rights reserved. */ |
| /* */ |
| /* Permission is given to use, copy, and modify this software for any */ |
| /* non-commercial purpose as long as this copyright notice is not */ |
| /* removed. All other uses, including redistribution in whole or in */ |
| /* part, are forbidden without prior written permission. */ |
| /* */ |
| /* This software is provided with absolutely no warranty and no */ |
| /* support. */ |
| /* */ |
| /*************************************************************************/ |
| |
| /****************************************************************************** |
| * * |
| * option.c: Rendering options selected. * |
| * * |
| ******************************************************************************/ |
| |
| #include "incl.h" |
| |
| int block_xlen,block_ylen; |
| BOOLEAN adaptive; /* adaptive ray tracing? */ |
| |
| /* During shading: */ |
| int density_epsilon; /* minimum (density*map_divisor) */ |
| /* (>= MIN_DENSITY) */ |
| int magnitude_epsilon; /* minimum (magnitude*grd_divisor)**2 */ |
| /* (> MIN_MAGNITUDE) */ |
| |
| /* Shading parameters of reflective surface: */ |
| float density_opacity[MAX_DENSITY+1]; /* opacity as function of density */ |
| float magnitude_opacity[MAX_MAGNITUDE+1];/* opacity as function of magnitude*/ |
| |
| /* Global lighting parameters: */ |
| PIXEL background; /* color of background assumed to be zero */ |
| /* because of hack for producing final */ |
| /* image on host from node images */ |
| float light[NM]; /* normalized vector from object to light */ |
| |
| /* Lighting parameters of reflective surface:*/ |
| float ambient_color; /* color of ambient reflection */ |
| float diffuse_color; /* color of diffuse reflection */ |
| float specular_color; /* color of specular reflection */ |
| float specular_exponent; /* exponent of specular reflection */ |
| |
| /* Depth cueing parameters: */ |
| float depth_hither; /* percentage of full intensity at hither */ |
| float depth_yon; /* percentage of full intensity at yon */ |
| float depth_exponent; /* exponent of falloff from hither to yon */ |
| |
| /* During shading, rendering, ray tracing: */ |
| float opacity_epsilon; /* minimum opacity */ |
| /* (usually >= MIN_OPACITY, */ |
| /* < MIN_OPACITY during shading shades */ |
| /* all voxels for generation of mipmap) */ |
| |
| /* During rendering and ray tracing: */ |
| float opacity_cutoff; /* cutoff opacity */ |
| /* (<= MAX_OPACITY) */ |
| |
| /* During ray tracing: */ |
| int highest_sampling_boxlen; /* highest boxlen for adaptive sampling */ |
| /* (>= 1) */ |
| int lowest_volume_boxlen; /* lowest boxlen for volume data */ |
| /* (>= 1) */ |
| int volume_color_difference; /* minimum color diff for volume data */ |
| /* (>= MIN_PIXEL) */ |
| int pyr_highest_level; /* highest level of pyramid to look at */ |
| /* (<= MAX_PYRLEVEL) */ |
| int pyr_lowest_level; /* lowest level of pyramid to look at */ |
| /* (>= 0) */ |
| float angle[NM]; /* initial viewing angle */ |
| |
| |
| EXTERN_ENV |
| |
| Init_Options() |
| { |
| |
| norm_address = NULL; |
| opc_address = NULL; |
| pyr_address[0] = NULL; |
| |
| background = NULL_PIXEL; |
| |
| Init_Opacity(); |
| Init_Lighting(); |
| |
| angle[X] = 90.0; |
| angle[Y] = -36.0; |
| angle[Z] = 0.0; |
| Init_Parallelization(); |
| |
| opacity_epsilon = 0.0; |
| opacity_cutoff = 0.95; |
| highest_sampling_boxlen = HBOXLEN; /* this must be less than BLOCK_LEN */ |
| /* and both must be powers of 2 */ |
| |
| lowest_volume_boxlen = 1; |
| |
| volume_color_difference = 16; |
| pyr_highest_level = 5; |
| pyr_lowest_level = 2; |
| } |
| |
| |
| Init_Opacity() |
| { |
| int i; |
| float increment; |
| |
| density_epsilon = 96; |
| magnitude_epsilon = 1; |
| |
| /* initialize opacity functions (hardwired for simplicity) */ |
| density_opacity[MIN_DENSITY] = 0.0; |
| density_opacity[95] = 0.0; |
| density_opacity[135] = 1.0; |
| density_opacity[MAX_DENSITY] = 1.0; |
| for (i=MIN_DENSITY; i<95; i++) density_opacity[i] = 0.0; |
| increment = 1.0/(135.0-95.0); |
| for (i=95; i<134; i++) |
| density_opacity[i+1] = density_opacity[i]+increment; |
| for (i=135; i<MAX_DENSITY; i++) density_opacity[i] = 1.0; |
| magnitude_opacity[MIN_MAGNITUDE] = 0.0; |
| magnitude_opacity[70] = 1.0; |
| magnitude_opacity[MAX_MAGNITUDE] = 1.0; |
| increment = 1.0/(70.0-(float)MIN_MAGNITUDE); |
| for (i=MIN_MAGNITUDE; i<69; i++) |
| magnitude_opacity[i+1] = magnitude_opacity[i]+increment; |
| for (i=70; i<MAX_MAGNITUDE-1; i++) magnitude_opacity[i] = 1.0; |
| } |
| |
| |
| Init_Lighting() |
| { |
| float inv_magnitude; |
| |
| /* Normalize vector from object to light source */ |
| light[X] = 0.5; |
| light[Y] = 0.7; |
| light[Z] = -1.0; |
| inv_magnitude = 1.0/sqrt(light[X]*light[X] + |
| light[Y]*light[Y] + |
| light[Z]*light[Z]); |
| light[X] = light[X]*inv_magnitude; |
| light[Y] = light[Y]*inv_magnitude; |
| light[Z] = light[Z]*inv_magnitude; |
| |
| ambient_color = 30.0; |
| diffuse_color = 100.0; |
| specular_color = 130.0; |
| specular_exponent = 10.0; |
| |
| depth_hither = 1.0; |
| depth_yon = 0.4; |
| depth_exponent = 1.0; |
| } |
| |
| |
| Init_Parallelization() |
| { |
| block_xlen = BLOCK_LEN; |
| block_ylen = BLOCK_LEN; |
| #ifdef RENDER_ONLY |
| printf("Rendering only: Starting from .norm, .opc and .pyr files\n"); |
| #else |
| #ifdef PREPROCESS |
| printf("Preprocessing only: From .den file to .norm, .opc, and .pyr files; no rendering\n"); |
| #else |
| printf("Both computing normals, opacities and octree as well as rendering: starting from .den file\n"); |
| #endif |
| #ifdef SERIAL_PREPROC |
| printf("NOTE: Preprocessing (computing normals, opacities and octree) is done serially by only one processor\n"); |
| #endif |
| #endif |
| |
| printf("Gouraud shading from lookup tables used\n"); |
| printf("\t%d processes\n",num_nodes); |
| printf("\t%dx%d image block size\n",block_xlen,block_ylen); |
| |
| if (adaptive) { |
| printf("\tdoing adaptive rendering\n"); |
| } |
| else |
| printf("\tdoing nonadaptive rendering\n"); |
| |
| printf("\tusing precomputed normals and opacities in separate array\n"); |
| |
| printf("\tusing opacity octree\n"); |
| |
| printf("\tstarting angle at (%.1f, %.1f, %.1f) with rotation step of %d\n", |
| angle[X],angle[Y],angle[Z],STEP_SIZE); |
| #ifdef DIM |
| printf("rotating %d steps in each of the three Cartesian directions\n",ROTATE_STEPS); |
| #else |
| printf("rotating %d steps in the Y direction\n",ROTATE_STEPS); |
| #endif |
| |
| printf("\n"); |
| } |