home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / GRAPHICS / rayshade.lzh / surface.c < prev    next >
Text File  |  1990-05-08  |  4KB  |  174 lines

  1. /*
  2.  * surface.c
  3.  *
  4.  * Copyright (C) 1989, Craig E. Kolb
  5.  *
  6.  * This software may be freely copied, modified, and redistributed,
  7.  * provided that this copyright notice is preserved on all copies.
  8.  *
  9.  * There is no warranty or other guarantee of fitness for this software,
  10.  * it is provided solely .  Bug reports or fixes may be sent
  11.  * to the author, who may or may not act on them as he desires.
  12.  *
  13.  * You may not include this software in a program or other software product
  14.  * without supplying the source, or without informing the end-user that the
  15.  * source is available for no extra charge.
  16.  *
  17.  * If you modify this software, you should include a notice giving the
  18.  * name of the person performing the modification, the date of modification,
  19.  * and the reason for such modification.
  20.  *
  21.  * $Id: surface.c,v 3.0.1.1 89/12/06 16:33:11 craig Exp $
  22.  *
  23.  * $Log:    surface.c,v $
  24.  * Revision 3.0.1.1  89/12/06  16:33:11  craig
  25.  * patch2: Added calls to new error/warning routines.
  26.  * 
  27.  * Revision 3.0  89/10/27  02:06:05  craig
  28.  * Baseline for first official release.
  29.  * 
  30.  */
  31. #include <stdio.h>
  32. #include "constants.h"
  33. #include "typedefs.h"
  34. #include "funcdefs.h"
  35.  
  36. #define blend(a, b, p, q)    (a * p + b * q)
  37. #define NORMCONST        (1. / 255.)
  38.  
  39. SurfaceList *Surfaces;        /* Linked list of defined surfaces */
  40.  
  41. /*
  42.  * Create and return pointer to surface with given properties.
  43.  */
  44. Surface *
  45. make_surface(name, amb, diff, spec, coef, refl, refr, k, translu, stcoef)
  46. char *name;
  47. Color *amb, *diff, *spec;
  48. double coef, refl, refr, k, translu, stcoef;
  49. {
  50.     Surface *stmp;
  51.  
  52.     /*
  53.      * Complain if named surface already exists.
  54.      */
  55.     if ((stmp = get_surface(name)) != (Surface *)0)
  56.         yyerror("Surface \"%s\" redefined.", name);
  57.  
  58.     stmp = (Surface *)Malloc(sizeof(Surface));
  59.     stmp->name = strsave(name);
  60.  
  61.     stmp->amb = *amb;
  62.     stmp->diff = *diff;
  63.     stmp->spec = *spec;
  64.  
  65.     stmp->coef = coef; stmp->refl = refl; stmp->transp = refr;
  66.     stmp->kref = k; stmp->translucency = translu;
  67.     stmp->stcoef = stcoef;
  68.  
  69.     return stmp;
  70. }
  71.  
  72. SurfaceList *
  73. add_surface(surf, list)
  74. Surface *surf;
  75. SurfaceList *list;
  76. {
  77.     SurfaceList *res;
  78.  
  79.     res = (SurfaceList *)Malloc(sizeof(SurfaceList));
  80.     res->surf = surf;
  81.     res->next = list;
  82.  
  83.     return res;
  84. }
  85.  
  86. /*
  87.  * Search for surface with given name.  If not found, complain and exit.
  88.  */
  89. Surface *
  90. find_surface(name)
  91. char *name;
  92. {
  93.     Surface *stmp;
  94.  
  95.     stmp = get_surface(name);
  96.     if (stmp == (Surface *)0)
  97.         yyerror("Undefined surface \"%s\".", name);
  98.  
  99.     return stmp;
  100. }
  101.  
  102. /*
  103.  * Return pointer to surface with given name, NULL if no such surface.
  104.  */
  105. Surface *
  106. get_surface(name)
  107. char *name;
  108. {
  109.     SurfaceList *stmp;
  110.  
  111.     for (stmp = Surfaces; stmp ; stmp = stmp->next)
  112.         if(strcmp(name, stmp->surf->name) == 0)
  113.             return stmp->surf;
  114.     /*
  115.      * No surface named "name".
  116.      */
  117.     return (Surface *)0;
  118. }
  119.  
  120. /*
  121.  * Compute combination of two surfaces. Resulting surface is copied into surf1.
  122.  */
  123. blend_surface(surf1, surf2, p, q)
  124. Surface *surf1, *surf2;
  125. double p, q;
  126. {
  127.     /*
  128.       * P is weight of surf1.  q is weight of surf2.
  129.      * Result is placed in surf1.
  130.      */
  131.  
  132.     blend_color(&surf1->amb, &surf2->amb, p, q);
  133.     blend_color(&surf1->diff, &surf2->diff, p, q);
  134.     blend_color(&surf1->spec, &surf2->spec, p, q);
  135.  
  136.     surf1->coef = blend(surf1->coef, surf2->coef, p, q);
  137.     surf1->refl = blend(surf1->refl, surf2->refl, p, q);
  138.     surf1->transp = blend(surf1->transp, surf2->transp, p, q);
  139.     surf1->kref = blend(surf1->kref, surf2->kref, p, q);
  140. }
  141.  
  142. /*
  143.  * Blend two colors.  Result is placed in color1.
  144.  */
  145. blend_color(color1, color2, p, q)
  146. Color *color1, *color2;
  147. double p, q;
  148. {
  149.     color1->r = blend(color1->r, color2->r, p, q);
  150.     color1->g = blend(color1->g, color2->g, p, q);
  151.     color1->b = blend(color1->b, color2->b, p, q);
  152. }
  153.  
  154. /*
  155.  * Scale color by given red, green and blue factors.
  156.  */
  157. ScaleColor(scalar, color, res)
  158. double scalar;
  159. Color color, *res;
  160. {
  161.     res->r = color.r * scalar;
  162.     res->g = color.g * scalar;
  163.     res->b = color.b * scalar;
  164. }
  165.  
  166. AddScaledColor(color1, scalar, color2, res)
  167. Color color1, color2, *res;
  168. double scalar;
  169. {
  170.     res->r = color1.r + scalar * color2.r;
  171.     res->g = color1.g + scalar * color2.g;
  172.     res->b = color1.b + scalar * color2.b;
  173. }
  174.