/* See {Pov.h} */ #include /* Last edited on 2007-01-25 10:41:22 by stolfi */ #include #define _GNU_SOURCE #include void WritePOVCoord(FILE *wr, double c) { fprintf(wr, "%10.6f", c); } void WritePOVPoint(FILE *wr, r3_t *p) { fprintf(wr, "<"); WritePOVCoord(wr, p->c[0]); fprintf(wr, ","); WritePOVCoord(wr, p->c[1]); fprintf(wr, ","); WritePOVCoord(wr, p->c[2]); fprintf(wr, ">"); } void WritePOVColor(FILE *wr, frgb_t *cr) { fprintf(wr, "rgb <"); fprintf(wr, "%10.4f", cr->c[0]); fprintf(wr, ","); fprintf(wr, "%10.4f", cr->c[1]); fprintf(wr, ","); fprintf(wr, "%10.4f", cr->c[2]); fprintf(wr, ">"); } void WritePOVColorTransp(FILE *wr, frgb_t *cr, float tr, bool_t filter) { if (filter){ fprintf(wr, "rgbf"); } else { fprintf(wr, "rgbt"); } fprintf(wr, " <"); fprintf(wr, "%10.4f", cr->c[0]); fprintf(wr, ","); fprintf(wr, "%10.4f", cr->c[1]); fprintf(wr, ","); fprintf(wr, "%10.4f", cr->c[2]); fprintf(wr, ","); fprintf(wr, "%10.4f", tr); fprintf(wr, ">"); } void WritePOVSphere ( FILE *wr, r3_t *p, float radius, frgb_t *cr, float tr, bool_t filter, char *tag1 /* DF "" */, char *tag2 /* DF "" */ ) { fprintf(wr, " sphere {\n"); fprintf(wr, " "); WritePOVPoint(wr,p); fprintf(wr, ", %.6f\n", radius); fprintf(wr, " texture { pigment { color "); WritePOVColorTransp(wr,cr,tr,filter); fprintf(wr, " } } // %s %s\n", tag1, tag2); fprintf(wr, " } \n"); fprintf(wr, "\n"); fflush(wr); } void WritePOVCylinder ( FILE *wr, r3_t *o, r3_t *d, float radius, frgb_t *cr, float tr, bool_t filter, char *tag1 /* DF "" */, char *tag2 /* DF "" */ ) { fprintf(wr, " cylinder {\n"); fprintf(wr, " "); WritePOVPoint(wr,o); fprintf(wr, ",\n"); fprintf(wr, " "); WritePOVPoint(wr,d); fprintf(wr, ",\n"); fprintf(wr, " %.6f\n", radius); fprintf(wr, " open\n"); fprintf(wr, " texture { pigment { color "); WritePOVColorTransp(wr, cr, tr,filter); fprintf(wr, " } } // %s %s\n", tag1, tag2); fprintf(wr, " }\n"); fprintf(wr, "\n"); fflush(wr); } void WritePOVTriangle ( FILE *wr, r3_t *a, r3_t *b, r3_t *c, frgb_t *cr, float tr, bool_t filter, char *tag1 /* DF "" */, char *tag2 /* DF "" */ ) { fprintf(wr," triangle { \n"); fprintf(wr," "); WritePOVPoint(wr,a); fprintf(wr, ",\n"); fprintf(wr," "); WritePOVPoint(wr,b); fprintf(wr, ",\n"); fprintf(wr," "); WritePOVPoint(wr,c); fprintf(wr, "\n"); fprintf(wr, " texture { pigment { color "); WritePOVColorTransp(wr, cr, tr, filter); fprintf(wr, " } finish { ambient 0.1 diffuse 0.9 } } // %s %s\n", tag1, tag2); fprintf(wr," }\n"); fprintf(wr,"\n"); fflush(wr); } void WritePOVTriangleTex ( FILE *wr, r3_t *a, r3_t *b, r3_t *c, char *texture ) { fprintf(wr," triangle { \n"); fprintf(wr," "); WritePOVPoint(wr,a); fprintf(wr, ",\n"); fprintf(wr," "); WritePOVPoint(wr,b); fprintf(wr, ",\n"); fprintf(wr," "); WritePOVPoint(wr,c); fprintf(wr, "\n"); fprintf(wr, " texture { %s }\n", texture); fprintf(wr, " } \n"); fprintf(wr, "\n"); fflush(wr); } void WritePOVSquare ( FILE *wr, r3_t *a, r3_t *b, r3_t *c, r3_t *d, frgb_t *cr, float tr, bool_t filter ) { fprintf(wr," union{\n"); fprintf(wr," "); fprintf(wr,"triangle {"); WritePOVPoint(wr,a); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,b); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,c); fprintf(wr,"}\n"); fprintf(wr," "); fprintf(wr,"triangle {"); WritePOVPoint(wr,c); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,d); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,a); fprintf(wr,"}\n"); fprintf(wr,"texture {\n"); fprintf(wr," pigment { color "); WritePOVColorTransp(wr,cr,tr,filter); fprintf(wr, " } finish { ambient 0.1 diffuse 0.9 } }\n"); fprintf(wr, " } \n"); fprintf(wr, "\n"); } void WritePOVTetrahedron ( FILE *wr, r3_t *u, r3_t *v, r3_t *w, r3_t *x, double du, double dv, double dw, double dx, frgb_t *cr, float tr, bool_t filter ) { fprintf(wr," intersection{\n"); fprintf(wr," plane{"); WritePOVPoint(wr,u); fprintf(wr,", "); WritePOVCoord(wr,du); fprintf(wr," }\n"); fprintf(wr," plane{"); WritePOVPoint(wr,v); fprintf(wr,", "); WritePOVCoord(wr,dv); fprintf(wr," }\n"); fprintf(wr," plane{"); WritePOVPoint(wr,w); fprintf(wr,", "); WritePOVCoord(wr,dw); fprintf(wr," }\n"); fprintf(wr," plane{"); WritePOVPoint(wr,x); fprintf(wr,", "); WritePOVCoord(wr,dx); fprintf(wr," }\n"); fprintf(wr," pigment { color rgbt <1.0000,1.0000,1.0000,0.925> }\n"); fprintf(wr," interior{\n"); fprintf(wr," media { emission "); WritePOVColorTransp(wr,cr,tr,filter); fprintf(wr," }\n"); fprintf(wr," }\n"); fprintf(wr," hollow\n"); fprintf(wr," }\n\n"); } void WritePOVSmoothTriangle ( FILE *wr, r3_t *a, r3_t *an, r3_t *b, r3_t *bn, r3_t *c, r3_t *cn, frgb_t *cr, float tr, bool_t filter ) { fprintf(wr, " smooth_triangle {\n"); fprintf(wr, " "); WritePOVPoint(wr,a); fprintf(wr, ", "); WritePOVPoint(wr,an); fprintf(wr, ",\n"); fprintf(wr, " "); WritePOVPoint(wr,b); fprintf(wr, ", "); WritePOVPoint(wr,bn); fprintf(wr, ",\n"); fprintf(wr, " "); WritePOVPoint(wr,c); fprintf(wr, ", "); WritePOVPoint(wr,cn); fprintf(wr, "\n"); /*fprintf(wr, " texture { wallexture } \n");*/ fprintf(wr, " pigment { color "); WritePOVColorTransp(wr,cr,tr,filter); fprintf(wr, " }\n"); fprintf(wr, " } \n"); fprintf(wr, "\n"); fflush(wr); } void WritePOVPenta ( FILE *wr, r3_t *a, r3_t *b, r3_t *c, r3_t *d, r3_t *e, frgb_t *cr, float tr, bool_t filter ) { fprintf(wr," union{\n"); fprintf(wr," ");fprintf(wr,"triangle {"); WritePOVPoint(wr,a); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,b); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,c); fprintf(wr,"}\n"); fprintf(wr," ");fprintf(wr,"triangle {"); WritePOVPoint(wr,c); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,d); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,a); fprintf(wr,"}\n"); fprintf(wr," ");fprintf(wr,"triangle {"); WritePOVPoint(wr,d); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,e); fprintf(wr,",\n"); fprintf(wr," ");WritePOVPoint(wr,a); fprintf(wr,"}\n"); fprintf(wr," pigment { color "); WritePOVColorTransp(wr,cr,tr,filter); fprintf(wr, " }\n"); fprintf(wr, " } \n"); fprintf(wr, "\n"); } #define Pov_C_author \ "Modified by L.A.P.Lozada on 00-05-17." #define Pov_C_COPYRIGHT \ "Copyright © 2000 Universidade Estadual de Campinas (UNICAMP)"