#include "pv.h" /* * Use centers of GRASS CELLS as vertexes for grid. * Currently, grid space is "unitized" so that the * largest dimension of the current region in GRASS == 1.0 */ void vrml_put_grid( FILE *vout, struct Cell_head *w, FILEDESC elevfd, FILEDESC colorfd, struct Colors *colr, int color_ok, int rows, int cols, int shh) { char str[512]; FCELL *tf; FCELL *dbuf; dbuf = (FCELL *)G_malloc (cols * sizeof (FCELL)); #ifdef VRML2 fprintf(vout,"grid\n"); vrml_putline(0,vout,"grid"); #else vrml_putline(0,vout,"Separator"); vrml_putline(1,vout,OCB); /* write grid vertices */ { double east, north; double coordx, coordy, coordz; int row, col; if(!shh) fprintf(stderr, "Writing vertices..."); vrml_putline(0,vout,"Coordinate3"); vrml_putline(1,vout,OCB); vrml_putline(0,vout,"point"); vrml_putline(1,vout,OSB); for (row = 0; row < rows; row++) { tf = dbuf; if(!shh) G_percent(row, rows - 1, 10); G_get_f_raster_row(elevfd, tf, row); coordz = G_row_to_northing((double)row, w); do_coordcnv(&coordz, 'z'); /* write a row */ for(col=0; col < cols; col++){ coordx = G_col_to_easting((double)col, w); do_coordcnv(&coordx, 'x'); /* HACK: no nulls in vrml grid */ if (G_is_f_null_value (tf)) *tf = 0.0; coordy = *tf; do_coordcnv(&coordy, 'y'); sprintf(str,"%f %f %f,", coordx, coordy, coordz); vrml_putline(0,vout,str); tf++; } /* end a row */ } vrml_putline(-1,vout,CSB); /* end point */ vrml_putline(-1,vout,CCB); /* end Coordinate3 */ } if(color_ok) /* write material color */ { int row, col; unsigned char *red, *green, *blue, *set; if(!shh) fprintf(stderr,"Writing color file..."); vrml_putline(0,vout,"Material"); vrml_putline(1,vout,OCB); vrml_putline(0,vout,"diffuseColor"); vrml_putline(1,vout,OSB); /* allocate buffers */ red = G_malloc (cols); green = G_malloc (cols); blue = G_malloc (cols); set = G_malloc (cols); tf = dbuf; for (row = 0; row < rows; row++) { if(!shh) G_percent(row, rows - 1, 5); G_get_f_raster_row(colorfd, tf, row); G_lookup_f_raster_colors (tf, red, green, blue, set, cols, colr); for(col=0; col < cols; col++){ sprintf(str,"%.3f %.3f %.3f,", red[col]/255., green[col]/255., blue[col]/255.); vrml_putline(0,vout,str); } } vrml_putline(-1, vout,CSB); /* end diffuseColor */ vrml_putline(-1, vout,CCB); /* end Material */ vrml_putline(0,vout,"MaterialBinding"); vrml_putline(1,vout,OCB); vrml_putline(0,vout,"value PER_VERTEX_INDEXED"); vrml_putline(-1, vout,CCB); /* end MaterialBinding */ G_free(red); G_free(green); G_free(blue); G_free(set); } /* write face set indices */ { int row, col, c1, c2; vrml_putline(0,vout,"IndexedFaceSet"); vrml_putline(1,vout,OCB); vrml_putline(0,vout,"coordIndex"); vrml_putline(1,vout,OSB); /* write indexes */ for (row = 0; row < rows-1; row++) { for(col=0; col < cols-1; col++){ c1 = row*cols+col; c2 = c1 + cols +1; sprintf(str,"%d, %d, %d, -1, %d, %d, %d, -1,", c1, c1+cols, c1+1, c2, c2-cols, c2-1 ); vrml_putline(0,vout,str); } } vrml_putline(-1, vout,CSB); /* end coordIndex */ vrml_putline(-1, vout,CCB); /* end IndexedFaceSet */ } vrml_putline(-1, vout,CCB); /* end Separator */ #endif /* G_free(ibuf); */ G_free(dbuf); }