2017-04-26 17:20:15 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* 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"
|
|
|
|
|
2017-04-26 18:03:02 +02:00
|
|
|
/* Derived values: */
|
2017-04-26 17:20:15 +02:00
|
|
|
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],
|
2017-04-26 18:03:02 +02:00
|
|
|
&obslight[X],&obslight[Y],&obslight[Z]);
|
2017-04-26 17:20:15 +02:00
|
|
|
|
|
|
|
/* Normalize transformed light vector */
|
|
|
|
inv_magnitude = 1.0/sqrt(obslight[X]*obslight[X] +
|
2017-04-26 18:03:02 +02:00
|
|
|
obslight[Y]*obslight[Y] +
|
|
|
|
obslight[Z]*obslight[Z]);
|
2017-04-26 17:20:15 +02:00
|
|
|
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] +
|
2017-04-26 18:03:02 +02:00
|
|
|
obseye[Y]*obseye[Y] +
|
|
|
|
obseye[Z]*obseye[Z]);
|
2017-04-26 17:20:15 +02:00
|
|
|
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] +
|
2017-04-26 18:03:02 +02:00
|
|
|
obshighlight[Y]*obshighlight[Y] +
|
|
|
|
obshighlight[Z]*obshighlight[Z]);
|
2017-04-26 17:20:15 +02:00
|
|
|
obshighlight[X] = obshighlight[X] * inv_magnitude * brightness;
|
|
|
|
obshighlight[Y] = obshighlight[Y] * inv_magnitude * brightness;
|
|
|
|
obshighlight[Z] = obshighlight[Z] * inv_magnitude * brightness;
|
|
|
|
}
|