22 #include <grass/gis.h>
23 #include <grass/ogsf.h>
27 #define FIRST_VOL_ID 81721
29 static geovol *Vol_top =
NULL;
45 for (gvl = Vol_top; gvl; gvl = gvl->next) {
46 if (gvl->gvol_id ==
id) {
69 for (pv = Vol_top; pv; pv = pv->next) {
70 if (pv->gvol_id ==
id - 1) {
92 for (i = 0, gvl = Vol_top; gvl; gvl = gvl->next, i++) {
109 for (i = 0, gvl = Vol_top; gvl; gvl = gvl->next, i++) ;
111 G_debug(5,
"gvl_num_vols(): num=%d", i);
126 G_debug(5,
"gvl_get_last_vol");
132 for (lvl = Vol_top; lvl->next; lvl = lvl->next) ;
134 G_debug(5,
" last vol id: %d", lvl->gvol_id);
149 G_debug(5,
"gvl_get_new_vol()");
151 nvl = (geovol *) G_malloc(
sizeof(geovol));
158 nvl->gvol_id = lvl->gvol_id + 1;
167 G_debug(5,
" id=%d", nvl->gvol_id);
185 int rows,
int cols,
int depths,
double xres,
double yres,
188 G_debug(5,
"gvl_init_vol() id=%d", gvl->gvol_id);
199 gvl->depths = depths;
205 gvl->xmax = ox + (cols - 1) * xres;
206 gvl->xrange = gvl->xmax - gvl->xmin;
208 gvl->ymax = oy + (rows - 1) * yres;
209 gvl->yrange = gvl->ymax - gvl->ymin;
211 gvl->zmax = oz + (depths - 1) * zres;
212 gvl->zrange = gvl->zmax - gvl->zmin;
214 gvl->x_trans = gvl->y_trans = gvl->z_trans = 0.0;
218 G_zero(gvl->isosurf,
sizeof(geovol_isosurf *) * MAX_ISOSURFS);
219 gvl->isosurf_x_mod = 1;
220 gvl->isosurf_y_mod = 1;
221 gvl->isosurf_z_mod = 1;
222 gvl->isosurf_draw_mode = DM_GOURAUD;
225 G_zero(gvl->slice,
sizeof(geovol_slice *) * MAX_SLICES);
226 gvl->slice_x_mod = 1;
227 gvl->slice_y_mod = 1;
228 gvl->slice_z_mod = 1;
229 gvl->slice_draw_mode = DM_GOURAUD;
232 gvl->clientdata =
NULL;
273 if (fvl == Vol_top) {
286 for (gvl = Vol_top; gvl && !found; gvl = gvl->next) {
289 if (gvl->next == fvl) {
291 gvl->next = fvl->next;
329 G_debug(5,
"ID: %d", gvl->gvol_id);
330 G_debug(5,
"cols: %d rows: %d depths: %d", gvl->cols, gvl->rows,
332 G_debug(5,
"ox: %lf oy: %lf oz: %lf", gvl->ox, gvl->oy, gvl->oz);
333 G_debug(5,
"xres: %lf yres: %lf zres: %lf", gvl->xres, gvl->yres,
335 G_debug(5,
"xmin: %f ymin: %f zmin: %f", gvl->xmin, gvl->ymin, gvl->zmin);
336 G_debug(5,
"xmax: %f ymax: %f zmax: %f", gvl->xmax, gvl->ymax, gvl->zmax);
337 G_debug(5,
"x_trans: %f y_trans: %f z_trans: %f", gvl->x_trans,
338 gvl->y_trans, gvl->z_trans);
354 *
min = gvl->xmin + gvl->x_trans;
355 *
max = gvl->xmax + gvl->x_trans;
371 *
min = gvl->ymin + gvl->y_trans;
372 *
max = gvl->ymax + gvl->y_trans;
388 *
min = gvl->zmin + gvl->z_trans;
389 *
max = gvl->zmax + gvl->z_trans;
416 for (gvl = Vol_top->next; gvl; gvl = gvl->next) {
453 for (gvl = Vol_top->next; gvl; gvl = gvl->next) {
490 for (gvl = Vol_top->next; gvl; gvl = gvl->next) {
522 G_debug(5,
"gvl_isosurf_init");
527 for (i = 0; i < MAX_ATTS; i++) {
528 isosurf->att[i].att_src = NOTSET_ATT;
529 isosurf->att[i].constant = 0.;
530 isosurf->att[i].hfile = -1;
531 isosurf->att[i].user_func =
NULL;
532 isosurf->att[i].att_data =
NULL;
533 isosurf->att[i].changed = 0;
536 isosurf->data =
NULL;
537 isosurf->data_desc = 0;
538 isosurf->inout_mode = 0;
555 G_debug(5,
"gvl_isosurf_freemem");
560 for (i = 0; i < MAX_ATTS; i++) {
582 G_debug(5,
"gvl_isosurf_get_isosurf(): id=%d isosurf=%d",
id, isosurf_id);
587 if ((isosurf_id < 0) || (isosurf_id > (gvl->n_isosurfs - 1)))
590 return gvl->isosurf[isosurf_id];
607 G_debug(5,
"isosurf_get_att_src");
609 if (!LEGAL_ATT(desc)) {
614 return (isosurf->att[desc].att_src);
632 G_debug(5,
"gvl_isosurf_set_att_src");
638 if (desc == ATT_COLOR) {
643 if (isosurf && LEGAL_SRC(src)) {
644 isosurf->att[desc].att_src = src;
666 G_debug(5,
"gvl_isosurf_set_att_const(): att=%d, const=%f",
670 isosurf->att[desc].constant = constant;
691 const char *filename)
695 G_debug(5,
"gvl_isosurf_set_att_map(): att=%d map=%s", desc, filename);
698 if (0 > (hfile =
gvl_file_newh(filename, VOL_FTYPE_RASTER3D)))
703 isosurf->att[desc].hfile = hfile;
705 if (ATT_COLOR == desc) {
727 G_debug(5,
"gvl_isosurf_set_att_changed");
729 if (isosurf && LEGAL_ATT(desc)) {
730 isosurf->att[desc].changed = 1;
732 if ((desc == ATT_TOPO) || (desc == ATT_MASK)) {
733 for (i = 1; i < MAX_ATTS; i++)
734 isosurf->att[i].changed = 1;
784 G_debug(5,
"gvl_slice_freemem");
810 if ((slice_id < 0) || (slice_id > (gvl->n_slices - 1)))
813 return gvl->slice[slice_id];