/**************************************************************************** * ray.c * * This module implements the code pertaining to rays. * * from Persistence of Vision Raytracer * Copyright 1993 Persistence of Vision Team *--------------------------------------------------------------------------- * NOTICE: This source code file is provided so that users may experiment * with enhancements to POV-Ray and to port the software to platforms other * than those supported by the POV-Ray Team. There are strict rules under * which you are permitted to use this file. The rules are in the file * named POVLEGAL.DOC which should be distributed with this file. If * POVLEGAL.DOC is not available or for more info please contact the POV-Ray * Team Coordinator by leaving a message in CompuServe's Graphics Developer's * Forum. The latest version of POV-Ray may be found there as well. * * This program is based on the popular DKB raytracer version 2.12. * DKBTrace was originally written by David K. Buck. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins. * *****************************************************************************/ #include "frame.h" #include "vector.h" #include "povproto.h" #define Mix(a,b,c) { \ (a).x = (b).x * (c).y; \ (a).y = (b).x * (c).z; \ (a).z = (b).y * (c).z; } void Make_Ray(r) RAY *r; { VECTOR Temp_Init_Dir; VSquareTerms (r -> Initial_2, r -> Initial); VSquareTerms (r -> Direction_2, r -> Direction); VEvaluate (r -> Initial_Direction, r -> Initial, r -> Direction); Mix (r -> Mixed_Initial_Initial, r -> Initial, r -> Initial); Mix (r -> Mixed_Dir_Dir, r -> Direction, r -> Direction); Mix (Temp_Init_Dir, r -> Initial, r -> Direction); Mix (r -> Mixed_Init_Dir, r -> Direction, r -> Initial); VAdd (r -> Mixed_Init_Dir, r -> Mixed_Init_Dir, Temp_Init_Dir); r -> Quadric_Constants_Cached = TRUE; } void Initialize_Ray_Containers (Ray) RAY *Ray; { Ray -> Containing_Index = -1; } void Copy_Ray_Containers (Dest_Ray, Source_Ray) RAY *Dest_Ray, *Source_Ray; { register int i; if ((Dest_Ray -> Containing_Index = Source_Ray -> Containing_Index) >= MAX_CONTAINING_OBJECTS) { fprintf (stderr, "ERROR - Containing Index too high\n"); close_all(); /* 16/10/1993 : M.A.: V 1.32: abandon sur erreur propre */ Wait_Keyboard_And_Quit(1); } for (i = 0 ; i < MAX_CONTAINING_OBJECTS ; i++) { Dest_Ray -> Containing_Textures[i] = Source_Ray -> Containing_Textures[i]; Dest_Ray -> Containing_IORs[i] = Source_Ray -> Containing_IORs[i]; } } void Ray_Enter (ray, texture) RAY *ray; TEXTURE *texture; { register int index; if ((index = ++(ray -> Containing_Index)) >= MAX_CONTAINING_OBJECTS) { fprintf (stderr, "Too many nested refracting objects\n"); close_all(); /* 16/10/1993 : M.A.: V 1.32: abandon sur erreur propre */ Wait_Keyboard_And_Quit(1); } ray -> Containing_Textures [index] = texture; ray -> Containing_IORs [index] = texture->Finish->Index_Of_Refraction; } void Ray_Exit (ray) RAY *ray; { if (--(ray -> Containing_Index) < -1) { fprintf (stderr, "Too many exits from refractions\n"); close_all(); /* 16/10/1993 : M.A.: V 1.32: abandon sur erreur propre */ Wait_Keyboard_And_Quit(1); } }