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

  1. /**********************************************************************/
  2. /*                                                                    */
  3. /* outp.c :                                                           */
  4. /*                                                                    */
  5. /* Generalized output routines. Currently only Optik flat shaded      */
  6. /* polygons are output.                                               */
  7. /*                                                                    */
  8. /* Copyright (C) 1992, Bernard Kwok                                   */
  9. /* All rights reserved.                                               */
  10. /* Revision 1.0                                                       */
  11. /* May, 1992                                                          */
  12. /**********************************************************************/
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include "geo.h"
  16. #include "misc.h"
  17. #include "io.h"
  18. #include "struct.h"
  19. #include "rad.h"
  20.  
  21. extern OptionType Option;
  22. extern int test_optik;
  23.  
  24. Colour avg_c = { 0., 0., 0.};
  25. /**********************************************************************/
  26. /* Output results after running radiosity on scene in optik format    */
  27. /**********************************************************************/
  28. void Write_RadOptik(rparams, filename, num)
  29.      RadParams rparams;
  30.      char *filename;
  31.      int num;
  32. {
  33.   int i,j;
  34.   Elist *elptr;
  35.   Polygon *eptr;
  36.   FILE *fp;
  37.   char ffilename[80];
  38.   Colour c[MAX_PATCH_VTX];
  39.   double Ks, Kd;
  40.  
  41.   if (num > 0) 
  42.     sprintf(ffilename,"%s.opt%d", filename, num);
  43.   else
  44.     sprintf(ffilename,"%s.opt", filename);
  45.   if (!(fp = fopen(ffilename, "w"))) {
  46.     fprintf(stderr,"%s: cannot open results file %s\n", ProgName, ffilename);
  47.     exit(1);
  48.   } 
  49.   printf("\n\t*** Printing %d polygons to %s ***\n", 
  50.      rparams.num_elements, ffilename);
  51.   
  52.   /* Print elements to file */
  53.   fprintf(fp,"/* Number polygons %d\n", rparams.num_elements);
  54.   elptr = rparams.elements;
  55.   for(i=0; i<rparams.num_elements;i++, elptr = elptr->next) {
  56.     eptr = elptr->element;
  57.  
  58.     /* Print patch label */
  59.     (void) fprintf(fp,"add object P%d polygon\n", i);
  60.  
  61.     /* Print vertex / normal pairs */
  62.     for (j=0;j<eptr->numVert;j++) {
  63.       (void) fprintf(fp,"\tvertex ",i);
  64.       (void) fprintf(fp,"\t%g %g %g ", eptr->vert[j]->pos.x, 
  65.           eptr->vert[j]->pos.y, eptr->vert[j]->pos.z);
  66.       (void ) fprintf(fp,"%g %g %g\n",
  67.           eptr->normal[j].x, eptr->normal[j].y, eptr->normal[j].z);
  68.     }
  69.     (void) fprintf(fp,"end\n");
  70.  
  71.     /* Print colour of patch (flat shade it for now) */
  72.     Ks = poly_object(eptr)->surface->shade.Ks.samples[0];
  73.     Kd = poly_object(eptr)->surface->shade.Kd.samples[0];
  74.  
  75.     avg_c.r = 0.;    avg_c.g = 0.;    avg_c.b = 0.;
  76.     if (Option.rad_interp_type == INTERP_VTX_FROM_PATCH) {
  77.       /* Take flat value */
  78.       avg_c.r = eptr->B.samples[0];
  79.       avg_c.g = eptr->B.samples[1];
  80.       avg_c.b = eptr->B.samples[2];
  81.     } else {
  82.       /* Take average colour of vertices */
  83.       Poly_VertexB(eptr, c);
  84.       for (j=0;j<eptr->numVert;j++) {
  85.     avg_c.r += (c[j].r / (double) eptr->numVert);
  86.     avg_c.g += (c[j].g / (double) eptr->numVert);
  87.     avg_c.b += (c[j].b / (double) eptr->numVert);
  88.     printf("avg=%g,%g,%g\n", avg_c.r, avg_c.g, avg_c.b);
  89.       }
  90.     }
  91.     (void) fprintf(fp,"add surface PS%d ",i);
  92.     avg_c.r *= (double) test_optik;
  93.     avg_c.g *= (double) test_optik;
  94.     avg_c.b *= (double) test_optik;
  95.     (void) fprintf(fp,"%g %g %g 1 0.5 %g %g\n", 
  96.            (avg_c.r > 1.0 ? 1.0 : avg_c.r), 
  97.            (avg_c.g > 1.0 ? 1.0 : avg_c.g), 
  98.            (avg_c.b > 1.0 ? 1.0 : avg_c.b), 
  99.            Ks, Kd);
  100.  
  101.     (void) fprintf(fp, "surface P%d PS%d\n", i,i);
  102.   }
  103.  
  104.   (void) fclose(fp);
  105. }
  106.