/* Create a sponge for the Radiance rendering program (Can easily be modified for any renderer) Paul Bourke */ #include "stdio.h" #include "stdlib.h" #include "math.h" main(c,v) int c; char **v; { int i,n=0; char s[32]; float x,y,z,r; FILE *fin,*fout,*frad; /* Which level to create */ if (c == 2) { n = atoi(v[1]); printf("Creating sponge at level %d\n",n); } /* Open the last level data file */ sprintf(s,"sponge%d",n); if ((fin = fopen(s,"r")) == NULL) { printf("Unable to open input file\n"); return; } /* Open the next level data file */ sprintf(s,"sponge%d",n+1); if ((fout = fopen(s,"w")) == NULL) { printf("Unavble to open output file\n"); return; } /* Open the next level Radiance file */ sprintf(s,"sponge%d.rad",n+1); if ((frad = fopen(s,"w")) == NULL) { printf("Unable to open output file\n"); return; } /* Write some Radiance header */ fprintf(frad,"void plastic m 0 0 5 .5 .5 .5 .05 05\n"); fprintf(frad,"void light light1 0 0 3 100 100 100\n"); fprintf(frad,"light1 sphere thelight1 0 0 4 100 0 100 10\n"); fprintf(frad,"light1 sphere thelight2 0 0 4 0 0 0 2\n"); fprintf(frad,"light1 sphere thelight3 0 0 4 0 -100 0 10\n"); while (fscanf(fin,"%f %f %f %f\n",&x,&y,&z,&r) == 4) { /* Bottom */ fprintf(fout,"%g %g %g %g\n",x-r/3,y-r/3,z-r/3,r/3); fprintf(fout,"%g %g %g %g\n",x ,y-r/3,z-r/3,r/3); fprintf(fout,"%g %g %g %g\n",x+r/3,y-r/3,z-r/3,r/3); fprintf(fout,"%g %g %g %g\n",x-r/3,y+r/3,z-r/3,r/3); fprintf(fout,"%g %g %g %g\n",x ,y+r/3,z-r/3,r/3); fprintf(fout,"%g %g %g %g\n",x+r/3,y+r/3,z-r/3,r/3); fprintf(fout,"%g %g %g %g\n",x-r/3,y ,z-r/3,r/3); fprintf(fout,"%g %g %g %g\n",x+r/3,y ,z-r/3,r/3); /* Top */ fprintf(fout,"%g %g %g %g\n",x-r/3,y-r/3,z+r/3,r/3); fprintf(fout,"%g %g %g %g\n",x ,y-r/3,z+r/3,r/3); fprintf(fout,"%g %g %g %g\n",x+r/3,y-r/3,z+r/3,r/3); fprintf(fout,"%g %g %g %g\n",x-r/3,y+r/3,z+r/3,r/3); fprintf(fout,"%g %g %g %g\n",x ,y+r/3,z+r/3,r/3); fprintf(fout,"%g %g %g %g\n",x+r/3,y+r/3,z+r/3,r/3); fprintf(fout,"%g %g %g %g\n",x-r/3,y ,z+r/3,r/3); fprintf(fout,"%g %g %g %g\n",x+r/3,y ,z+r/3,r/3); /* Middle Corners */ fprintf(fout,"%g %g %g %g\n",x-r/3,y-r/3,z ,r/3); fprintf(fout,"%g %g %g %g\n",x-r/3,y+r/3,z ,r/3); fprintf(fout,"%g %g %g %g\n",x+r/3,y-r/3,z ,r/3); fprintf(fout,"%g %g %g %g\n",x+r/3,y+r/3,z ,r/3); /* Create Radiance boxes */ /* Bottom */ gencube(frad,x-r/3,y-r/3,z-r/3,r); gencube(frad,x ,y-r/3,z-r/3,r); gencube(frad,x+r/3,y-r/3,z-r/3,r); gencube(frad,x-r/3,y+r/3,z-r/3,r); gencube(frad,x ,y+r/3,z-r/3,r); gencube(frad,x+r/3,y+r/3,z-r/3,r); gencube(frad,x-r/3,y ,z-r/3,r); gencube(frad,x+r/3,y ,z-r/3,r); /* Top */ gencube(frad,x-r/3,y-r/3,z+r/3,r); gencube(frad,x ,y-r/3,z+r/3,r); gencube(frad,x+r/3,y-r/3,z+r/3,r); gencube(frad,x-r/3,y+r/3,z+r/3,r); gencube(frad,x ,y+r/3,z+r/3,r); gencube(frad,x+r/3,y+r/3,z+r/3,r); gencube(frad,x-r/3,y ,z+r/3,r); gencube(frad,x+r/3,y ,z+r/3,r); /* Middle Corners */ gencube(frad,x-r/3,y-r/3,z ,r); gencube(frad,x-r/3,y+r/3,z ,r); gencube(frad,x+r/3,y-r/3,z ,r); gencube(frad,x+r/3,y+r/3,z ,r); } /* Finished, close the files */ fclose(fin); fclose(fout); fclose(frad); } /* Create a Radiance descition of a cube Only create the three facets if we are propared to view from one quadrant only */ void gencube(f,x,y,z,r) FILE *f; float r,x,y,z; { float r3; r3 = r / 3.0; fprintf(f,"m polygon p 0 0 12 "); fprintf(f,"%g %g %g %g %g %g %g %g %g %g %g %g\n", x,y,z,x+r3,y,z,x+r3,y,z+r3,x,y,z+r3); fprintf(f,"m polygon p 0 0 12 "); fprintf(f,"%g %g %g %g %g %g %g %g %g %g %g %g\n", x+r3,y,z,x+r3,y+r3,z,x+r3,y+r3,z+r3,x+r3,y,z+r3); fprintf(f,"m polygon p 0 0 12 "); fprintf(f,"%g %g %g %g %g %g %g %g %g %g %g %g\n", x,y,z+r3,x+r3,y,z+r3,x+r3,y+r3,z+r3,x,y+r3,z+r3); }