blob: b772d5cf01fd4aa6d0ebed23fda1bb624fa9fc0a [file] [log] [blame]
/*************************************************************************/
/* */
/* 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;
}