/*************************************************************************/ /* */ /* 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. */ /* */ /*************************************************************************/ /****************************************************************************** * * * render.c: Render dataset via raytracing. * * * ******************************************************************************/ #include "incl.h" /* Derived values: */ float obslight[NM]; /* observer transformed light vector */ float obshighlight[NM]; /* observer transformed highlight vector */ EXTERN_ENV void Render(long my_node) /* assumes direction is +Z */ { if (my_node == ROOT) { Observer_Transform_Light_Vector(); Compute_Observer_Transformed_Highlight_Vector(); } Ray_Trace(my_node); } void Observer_Transform_Light_Vector() { float inv_magnitude; /* Transform light vector by inverse of viewing matrix */ /* to move shading light inversely with ray tracing observer. */ /* Matrix should include only scaling and rotation, not translation. */ /* If no matrix has been loaded, an identity transform is performed. */ /* Effect of of these two observer transforms is, if computation */ /* of colors is repeated on each frame of sequence, and same */ /* scaling and rotation is used during shading and ray tracing, */ /* light source will appear fixed relative to observer. */ Transform_Point(light[X],light[Y],light[Z], &obslight[X],&obslight[Y],&obslight[Z]); /* Normalize transformed light vector */ inv_magnitude = 1.0/sqrt(obslight[X]*obslight[X] + obslight[Y]*obslight[Y] + obslight[Z]*obslight[Z]); obslight[X] = obslight[X] * inv_magnitude; obslight[Y] = obslight[Y] * inv_magnitude; obslight[Z] = obslight[Z] * inv_magnitude; } void Compute_Observer_Transformed_Highlight_Vector() { float inv_magnitude; float obseye[NM]; /* observer transformed eye vector */ float brightness=1.0; float eye[NM]; /* normalized vector from object to eye */ /* Transform eye vector by inverse of viewing matrix */ /* to move shading observer with ray tracing observer. */ /* Matrix should include only scaling and rotation, not translation. */ /* If no matrix has been loaded, an identity transform is performed. */ eye[X] = 0.0; eye[Y] = 0.0; eye[Z] = -1.0; Transform_Point(eye[X],eye[Y],eye[Z],&obseye[X],&obseye[Y],&obseye[Z]); /* Normalize transformed eye vector */ inv_magnitude = 1.0/sqrt(obseye[X]*obseye[X] + obseye[Y]*obseye[Y] + obseye[Z]*obseye[Z]); obseye[X] = obseye[X] * inv_magnitude; obseye[Y] = obseye[Y] * inv_magnitude; obseye[Z] = obseye[Z] * inv_magnitude; /* Compute observer transformed maximum highlight vector */ /* as diagonal of rhombus formed by normalized observer transformed */ /* light vector and normalized observer transformed eye vector. */ obshighlight[X] = obslight[X] + obseye[X]; obshighlight[Y] = obslight[Y] + obseye[Y]; obshighlight[Z] = obslight[Z] + obseye[Z]; /* Normalize transformed highlight vector */ inv_magnitude = 1.0/sqrt(obshighlight[X]*obshighlight[X] + obshighlight[Y]*obshighlight[Y] + obshighlight[Z]*obshighlight[Z]); obshighlight[X] = obshighlight[X] * inv_magnitude * brightness; obshighlight[Y] = obshighlight[Y] * inv_magnitude * brightness; obshighlight[Z] = obshighlight[Z] * inv_magnitude * brightness; }