home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / raytrace / radiance / simplerd.lha / simplerad / FinalFTP / Light / amb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-21  |  4.4 KB  |  126 lines

  1. /**********************************************************************/
  2. /* amb.c                                                              */
  3. /* Misc. code for progressive refinement scene display                */
  4. /*  - ambient term apptroximation code                                */
  5. /*                                                                    */
  6. /* Copyright (C) 1992, Bernard Kwok                                   */
  7. /* All rights reserved.                                               */
  8. /* Revision 1.0                                                       */
  9. /* May, 1992                                                          */
  10. /**********************************************************************/
  11. #include <stdio.h>
  12. #include <math.h>
  13. #include "geo.h"
  14. #include "io.h"
  15. #include "struct.h"
  16. #include "rad.h"
  17. #include "display.h"
  18.  
  19. extern RadParams ReadLog;
  20. extern Scene RadScene;
  21. Colour Pr_Add_Ambient();
  22.  
  23. /*====================================================================*/
  24. /* Progessive Refinment ambient term -- only for display purposes     */
  25. /*====================================================================*/
  26. /**********************************************************************/
  27. /* Approximation of patch ff as it's area over total area in scene */
  28. /**********************************************************************/
  29. double Pr_FF_Approx(patch)
  30.      Polygon *patch;
  31. { return (patch->area / ReadLog.totalArea); }
  32.  
  33. /**********************************************************************/
  34. /* From reflectance * area for all polys */
  35. /**********************************************************************/
  36. Spectra Pr_PTotal_Area()
  37. {
  38.   int i,j,k,l;
  39.   Objectt *optr;
  40.   Mesh *mptr;
  41.   Polygon *pptr;
  42.   Scene *sptr = &RadScene;
  43.   Spectra ptotal_area;
  44.   Spectra poly_p;
  45.   double poly_a;
  46.  
  47.   for(l=0;l<MAX_SPECTRA_SAMPLES;l++) 
  48.     ptotal_area.samples[l] = 0.0;
  49.   for(i=0, optr=sptr->objects;i<sptr->num_objects;i++, optr++) 
  50.     for(j=0, mptr=optr->meshes;j<optr->num_meshes;j++, mptr++) 
  51.       for(k=0, pptr=mptr->polys;k<mptr->num_polys;k++, pptr++) {
  52.     poly_p = poly_reflect(pptr);
  53.     poly_a = pptr->area;
  54.     for(l=0;l<MAX_SPECTRA_SAMPLES;l++) 
  55.       ptotal_area.samples[l] += poly_a * poly_p.samples[l];
  56.       }
  57.   return ptotal_area;
  58. }
  59.  
  60. /**********************************************************************/
  61. /* Inter-reflection factor */
  62. /**********************************************************************/
  63. double Pr_Interreflect_Factor(pavg)
  64.      double pavg;
  65. { return (1.0 / ( 1.0 - pavg)); }
  66.  
  67. /**********************************************************************/
  68. /* Computer "ambient term" for display purposes */
  69. /**********************************************************************/
  70. Spectra Pr_Ambient_Term()
  71. {
  72.   int i,j,k,l;
  73.   Spectra ambient_term;
  74.   Spectra pavg;
  75.   Objectt *optr;
  76.   Mesh *mptr;
  77.   Polygon *pptr;
  78.   Scene *sptr = &RadScene;
  79.  
  80.   for(l=0;l<MAX_SPECTRA_SAMPLES;l++) 
  81.     ambient_term.samples[l] = 0.0;
  82.   
  83.   if (ReadLog.ptotalArea.samples[0] < 0.0)
  84.     ReadLog.ptotalArea = Pr_PTotal_Area();
  85.   for(l=0;l<MAX_SPECTRA_SAMPLES;l++) 
  86.     pavg.samples[l] = ReadLog.ptotalArea.samples[l] / ReadLog.totalArea;
  87.   for(i=0, optr=sptr->objects;i<sptr->num_objects;i++, optr++) 
  88.     for(j=0, mptr=optr->meshes;j<optr->num_meshes;j++, mptr++) 
  89.       for(k=0, pptr=mptr->polys;k<mptr->num_polys;k++, pptr++)
  90.     for(l=0;l<MAX_SPECTRA_SAMPLES;l++) 
  91.       ambient_term.samples[l] +=
  92.         pptr->unshot_B.samples[l] * Pr_FF_Approx(pptr);
  93.  
  94.   for(l=0;l<MAX_SPECTRA_SAMPLES;l++) 
  95.     ambient_term.samples[l] *= Pr_Interreflect_Factor(pavg.samples[l]);  
  96.   return ambient_term;
  97. }
  98.  
  99. /**********************************************************************/
  100. /* Add ambient term for display                                       */
  101. /* - currently use scaled ambient term.                               */
  102. /**********************************************************************/
  103. Colour Pr_Add_Ambient(vtx_Col, polyp)
  104.      Colour vtx_Col;
  105.      Spectra polyp;
  106. {
  107.   Colour vtx_Col_dsp;
  108.  
  109.   vtx_Col_dsp.r = vtx_Col.r + 
  110.     (polyp.samples[0] * ReadLog.ambient_term.samples[0] / 5.0);
  111.   /* if (vtx_Col_dsp.r > 1.0)
  112.      vtx_Col_dsp.r = 1.0; */
  113.   vtx_Col_dsp.g = vtx_Col.g + 
  114.     (polyp.samples[1] * ReadLog.ambient_term.samples[1] / 5.0) ;
  115.   /* if (vtx_Col_dsp.g > 1.0)
  116.      vtx_Col_dsp.g = 1.0; */
  117.   vtx_Col_dsp.b = vtx_Col.b + 
  118.     (polyp.samples[2] * ReadLog.ambient_term.samples[2] / 5.0);
  119.   /* if (vtx_Col_dsp.b > 1.0)
  120.      vtx_Col_dsp.b = 1.0; */
  121.  
  122.   return vtx_Col_dsp;
  123. }
  124.  
  125.  
  126.