GRASS 8 Programmer's Manual 8.6.0dev(2026)-55de52a352
Loading...
Searching...
No Matches
gvld.c
Go to the documentation of this file.
1/*!
2 \file lib/ogsf/gvld.c
3
4 \brief OGSF library - loading and manipulating volumes (lower level
5 functions)
6
7 GRASS OpenGL gsurf OGSF Library
8
9 SPDX-FileCopyrightText: 1999-2008 GRASS Development Team
10 SPDX-License-Identifier: GPL-2.0-or-later
11
12 \author Tomas Paudits (February 2004)
13 \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
14 */
15
16#include <math.h>
17
18#include <grass/gis.h>
19#include <grass/ogsf.h>
20
21#include "mc33_table.h"
22
23/* useful macros */
24#define READ() gvl_read_char(pos[i]++, gvl->isosurf[i]->data)
25
26/*!
27 \brief Draw volume set (slices and isosurfaces)
28
29 \param gvl pointer to geovol struct
30
31 \return -1 on failure
32 \return 1 on success
33 */
35{
36 G_debug(5, "gvld_vol(): id=%d", gvl->gvol_id);
37
38 /* SLICES */
39 /* calculate slices data, if slices changed */
40 if (0 > gvl_slices_calc(gvl))
41 return (-1);
42 /* draw slices */
43 if (0 > gvld_slices(gvl))
44 return (-1);
45
46 /* ISOSURFACES */
47 /* calculate isosurfaces data, if isosurfaces changed */
48 if (0 > gvl_isosurf_calc(gvl))
49 return (-1);
50 /* draw isosurfaces */
51 if (0 > gvld_isosurf(gvl))
52 return (-1);
53
54 return (1);
55}
56
57/*!
58 \brief Draw volume in wire mode (bounding box)
59
60 \param gvl pointer to geovol struct
61
62 \return -1 on failure
63 \return 1 on success
64 */
66{
67 G_debug(5, "gvld_wire_vol(): id=%d", gvl->gvol_id);
68
70
71 if (0 > gvld_wire_slices(gvl))
72 return (-1);
73
74 if (0 > gvld_wire_isosurf(gvl))
75 return (-1);
76
77 return (1);
78}
79
80/*!
81 \brief Draw volume isosurfaces
82
83 \param gvl pointer to geovol struct
84
85 \return -1 on failure
86 \return 1 on success
87 */
89{
90 float tx, ty, tz;
91 int cols, rows, depths;
92 int x, y, z, i, iv;
93 float xc, yc, zc;
94 float xres, yres, zres;
95 unsigned r, g, b;
96
97 int j, p, num, c_ndx, crnt_ev;
98 float n[3], pt[4];
99
100 int n_i = gvl->n_isosurfs;
101
103 float *kem, *ksh, pkem, pksh;
104 unsigned int *ktrans, *curcolor;
105 int pktransp = 0;
106 int ret = 0;
107
108 int *pos, *nz, *e_dl, tmp_pos, edge_pos[13];
109
111 GLint viewport[4];
112 GLint window[4];
113
114 geovol_isosurf *isosurf;
115
116 /* Allocate memory for arrays */
117
118 check_color = G_malloc(n_i * sizeof(int));
119 check_transp = G_malloc(n_i * sizeof(int));
120 check_material = G_malloc(n_i * sizeof(int));
121 check_emis = G_malloc(n_i * sizeof(int));
122 check_shin = G_malloc(n_i * sizeof(int));
123
124 kem = G_malloc(n_i * sizeof(float));
125 ksh = G_malloc(n_i * sizeof(float));
126
127 ktrans = G_malloc(n_i * sizeof(unsigned int));
128 curcolor = G_malloc(n_i * sizeof(unsigned int));
129
130 pos = G_malloc(n_i * sizeof(int));
131 nz = G_malloc(n_i * sizeof(int));
132 e_dl = G_malloc(n_i * sizeof(int));
133
134 G_debug(5, "gvld_isosurf():");
135 for (i = 0; i < gvl->n_isosurfs; i++) {
136 G_debug(5, " start : gvl: %s isosurf : %d\n",
137 gvl_file_get_name(gvl->hfile), i);
138 }
139
140 /* shade */
141 gsd_shademodel(gvl->isosurf_draw_mode & DM_GOURAUD);
142
143 /* scaling */
144 GS_get_scale(&tx, &ty, &tz, 1);
145
146 /* set number of cols, rows, dephs */
147 cols = gvl->cols / gvl->isosurf_x_mod;
148 rows = gvl->rows / gvl->isosurf_y_mod;
149 depths = gvl->depths / gvl->isosurf_z_mod;
150
151 /* set x,y,z resolution */
152 xres =
153 /*((float) gvl->cols) / ((float) cols) */ gvl->isosurf_x_mod *
154 gvl->xres;
155 yres =
156 /*((float) gvl->rows) / ((float) rows) */ gvl->isosurf_y_mod *
157 gvl->yres;
158 zres =
159 /*((float) gvl->depths) / ((float) depths) */ gvl->isosurf_z_mod *
160 gvl->zres;
161
162 /* get viewport */
164
165 /* adjust window */
166 window[0] += (int)(yres * 2);
167 window[1] -= (int)(yres * 2);
168 window[2] -= (int)(xres * 2);
169 window[3] += (int)(xres * 2);
170
173 gsd_do_scale(1);
174 gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
175
176 pkem = 1.0;
177 pksh = 1.0;
178
179 /* set default attribute values for isosurfaces */
180 for (i = 0; i < gvl->n_isosurfs; i++) {
181 isosurf = gvl->isosurf[i];
182
183 /* init isosurf one cube edge datalength */
184 e_dl[i] = 4;
185
186 /* transparency */
187 check_transp[i] = 0;
188 ktrans[i] = (255U << 24);
189 if (CONST_ATT == isosurf->att[ATT_TRANSP].att_src &&
190 isosurf->att[ATT_TRANSP].constant != 0.0) {
191 ktrans[i] = (255 - (int)isosurf->att[ATT_TRANSP].constant) << 24;
192 }
193 else if (MAP_ATT == isosurf->att[ATT_TRANSP].att_src) {
194 check_transp[i] = 1;
195 e_dl[i]++;
196 }
197
198 /* emis */
199 check_emis[i] = 0;
200 kem[i] = 0.0;
201 if (CONST_ATT == isosurf->att[ATT_EMIT].att_src) {
202 kem[i] = isosurf->att[ATT_EMIT].constant / 255.;
203 }
204 else if (MAP_ATT == isosurf->att[ATT_EMIT].att_src) {
205 check_emis[i] = 1;
206 e_dl[i]++;
207 }
208
209 /* shin */
210 check_shin[i] = 0;
211 ksh[i] = 0.0;
212 if (CONST_ATT == isosurf->att[ATT_SHINE].att_src) {
213 ksh[i] = isosurf->att[ATT_SHINE].constant / 255.;
214 }
215 else if (MAP_ATT == isosurf->att[ATT_SHINE].att_src) {
216 check_shin[i] = 1;
217 e_dl[i]++;
218 }
219
220 /* color */
221 check_color[i] = 0;
222 curcolor[i] = 0.0;
223 if (CONST_ATT == isosurf->att[ATT_COLOR].att_src) {
224 curcolor[i] = (int)isosurf->att[ATT_COLOR].constant;
225 }
226 else if (MAP_ATT == isosurf->att[ATT_COLOR].att_src) {
227 check_color[i] = 1;
228 e_dl[i] += 3;
229 }
230
231 /* check material */
232 check_material[i] =
233 (check_shin[i] || check_emis[i] || (kem[i] && check_color[i]));
234
235 /* set position in data */
236 pos[i] = 0;
237 nz[i] = 0;
238 }
239
240 G_debug(5, " initialize OK");
241
242 for (z = 0; z < depths - 1; z++) {
243 zc = z * zres;
244
245 if (GS_check_cancel()) {
246 for (i = 0; i < gvl->n_isosurfs; i++) {
247 G_debug(5, " break : isosurf : %d datalength : %d B\n", i,
248 pos[i]);
249 }
250
251 gsd_set_material(1, 1, 0., 0., 0x0);
253 gsd_blend(0);
254 gsd_zwritemask(0xffffffff);
255 ret = -1;
256 goto cleanup_exit;
257 }
258
259 for (y = 0; y < rows - 1; y++) {
260 yc = ((rows - 1) * yres) - (y * yres);
261
262 for (x = 0; x < cols - 1; x++) {
263 xc = x * xres;
264
265 for (i = 0; i < gvl->n_isosurfs; i++) {
266
267 /* read cube index */
268 if (nz[i] != 0) {
269 nz[i]--;
270 continue;
271 }
272 else {
273 c_ndx = READ();
274 if (c_ndx == 0) {
275 nz[i] = READ() - 1;
276 continue;
277 }
278 else {
279 c_ndx = (c_ndx - 1) * 256 + READ();
280 }
281 }
282
283 /* save position */
284 tmp_pos = pos[i];
285
286 /* set position for each cube edge data */
287 iv = 0;
288 for (j = 0; j < cell_table[c_ndx].nedges; j++) {
289 if (cell_table[c_ndx].edges[j] == 12)
290 iv = 1;
291
293 pos[i] + j * e_dl[i];
294 }
295
296 /* enable/disable blending and depth buffer writing */
297 if (check_transp[i] || (ktrans[i] >> 24) < 255) {
298 if (!pktransp) {
299 gsd_blend(1);
301 }
302 }
303 else if (pktransp) {
304 gsd_blend(0);
305 gsd_zwritemask(0xffffffff);
306 pktransp = 0;
307 }
308
309 /* draw cube polygons */
310 for (p = 0, num = 0; num < cell_table[c_ndx].npolys;
311 num++) {
313
314 for (j = 0; j < 3; j++) {
316 /* set position in data to current edge data */
317 pos[i] = edge_pos[crnt_ev];
318
319 /* triangle vertex */
320 if (crnt_ev == 12) {
321 pt[X] = xc + (READ() / 255. * xres);
322 pt[Y] = yc + (-(READ() / 255. * yres));
323 pt[Z] = zc + (READ() / 255. * zres);
324 }
325 else {
326 pt[edge_vert_pos[crnt_ev][0]] = READ() / 255.;
327 pt[edge_vert_pos[crnt_ev][1]] =
328 edge_vert_pos[crnt_ev][2];
329 pt[edge_vert_pos[crnt_ev][3]] =
330 edge_vert_pos[crnt_ev][4];
331
332 pt[X] = xc + (pt[X] * xres);
333 pt[Y] = yc + (-(pt[Y] * yres));
334 pt[Z] = zc + (pt[Z] * zres);
335 }
336
337 n[X] = (READ() / 127. - 1.) / xres;
338 n[Y] = (-(READ() / 127. - 1.)) / yres;
339 n[Z] = (READ() / 127. - 1.) / zres;
340
341 if (gvl->isosurf[i]->inout_mode) {
342 n[X] *= -1;
343 n[Y] *= -1;
344 n[Z] *= -1;
345 }
346
347 if (check_color[i]) {
348 r = READ();
349 g = READ();
350 b = READ();
351 curcolor[i] = (r & 0xff) | ((g & 0xff) << 8) |
352 ((b & 0xff) << 16);
353 }
354
355 if (check_transp[i])
356 ktrans[i] = READ() << 24;
357 ;
358
359 if (check_shin[i])
360 ksh[i] = ((float)READ()) / 255.;
361
362 if (check_emis[i])
363 kem[i] = ((float)READ()) / 255.;
364
365 if (pksh != ksh[i] || pkem != kem[i] ||
366 (kem[i] && check_color[i])) {
367 pksh = ksh[i];
368 pkem = kem[i];
369 gsd_set_material(1, 1, ksh[i], kem[i],
370 curcolor[i]);
371 }
372
373 gsd_litvert_func(n, ktrans[i] | curcolor[i], pt);
374 p++;
375 }
376
378 }
379
380 /* set position to next cube */
381 pos[i] = tmp_pos + cell_table[c_ndx].nedges * e_dl[i] +
382 (iv ? 2 : 0);
383 }
384 }
385 }
386 }
387
388 for (i = 0; i < gvl->n_isosurfs; i++) {
389 G_debug(5, " end : isosurf : %d datalength : %d B\n", i, pos[i]);
390 }
391
392 gsd_set_material(1, 1, 0., 0., 0x0);
394 gsd_blend(0);
395 gsd_zwritemask(0xffffffff);
397 G_free(e_dl);
398 G_free(nz);
399 G_free(pos);
401 G_free(ktrans);
402 G_free(ksh);
403 G_free(kem);
409 return ret;
410}
411
412/*!
413 \brief Draw volume isosurface in draw mode
414
415 \param gvl pointer to geovol struct [unused]
416
417 \return 0
418 */
420{
421 return (0);
422}
423
424/************************************************************************/
425/* SLICES */
426
427/************************************************************************/
428
429#define DISTANCE_2(x1, y1, x2, y2) \
430 sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
431
432/*!
433 \brief Draw slices
434
435 \param gvl pointer to geovol struct
436
437 \return 0
438 */
440{
441 float tx, ty, tz;
442 int i;
443
445 GLint viewport[4];
446 GLint window[4];
447
448 G_debug(5, "gvld_slices");
449
450 /* shade */
451 gsd_shademodel(gvl->slice_draw_mode & DM_GOURAUD);
452
453 /* scaling */
454 GS_get_scale(&tx, &ty, &tz, 1);
455
456 /* get viewport */
458
461 gsd_do_scale(1);
462 gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
463
464 for (i = 0; i < gvl->n_slices; i++) {
465 gsd_blend(0);
466 gsd_zwritemask(0xffffffff);
467
468 if (gvl->slice[i]->transp == 0)
469 gvld_slice(gvl, i);
470 }
471
472 for (i = 0; i < gvl->n_slices; i++) {
473 gsd_blend(1);
474 gsd_zwritemask(0x0);
475
476 if (gvl->slice[i]->transp > 0)
477 gvld_slice(gvl, i);
478 }
479
480 gsd_set_material(1, 1, 0., 0., 0x0);
482 gsd_blend(0);
483 gsd_zwritemask(0xffffffff);
484
485 return (0);
486}
487
488/*!
489 \brief Draw slice
490
491 \param gvl pointer to geovol struct
492 \param ndx
493
494 \return 1
495 */
497{
498 geovol_slice *slice;
499
500 int color, offset, transp;
501 float n[3], pt[4];
502 float x, nextx, y, nexty, z, stepx, stepy, stepz;
503 int cols, rows, c, r;
505 int ptX, ptY, ptZ;
506 double resx, resy, resz;
507
508 /* current slice */
509 slice = gvl->slice[ndx];
510
511 /* distance between slice def. pts */
512 distxy = DISTANCE_2(slice->x2, slice->y2, slice->x1, slice->y1);
513 distz = fabsf(slice->z2 - slice->z1);
514
515 /* distance between slice def pts is zero - zero slice */
516 if (distxy == 0. || distz == 0.) {
517 return (1);
518 }
519
520 /* set slice mod, resolution and set correct coords */
521 if (slice->dir == X) {
522 modx = gvl->slice_y_mod;
523 mody = gvl->slice_z_mod;
524 modz = gvl->slice_x_mod;
525 resx = gvl->yres;
526 resy = gvl->zres;
527 resz = gvl->xres;
528 ptX = Y;
529 ptY = Z;
530 ptZ = X;
531 }
532 else if (slice->dir == Y) {
533 modx = gvl->slice_x_mod;
534 mody = gvl->slice_z_mod;
535 modz = gvl->slice_y_mod;
536 resx = gvl->xres;
537 resy = gvl->zres;
538 resz = gvl->yres;
539 ptX = X;
540 ptY = Z;
541 ptZ = Y;
542 }
543 else {
544 modx = gvl->slice_x_mod;
545 mody = gvl->slice_y_mod;
546 modz = gvl->slice_z_mod;
547 resx = gvl->xres;
548 resy = gvl->yres;
549 resz = gvl->zres;
550 ptX = X;
551 ptY = Y;
552 ptZ = Z;
553 }
554
555 /* x,y mod */
556 modxy = DISTANCE_2((slice->x2 - slice->x1) / distxy * modx,
557 (slice->y2 - slice->y1) / distxy * mody, 0., 0.);
558
559 /* cols/rows of slice */
560 f_cols = distxy / modxy;
561 cols = f_cols > (int)f_cols ? (int)f_cols + 1 : (int)f_cols;
562
563 f_rows = distz / modz;
564 rows = f_rows > (int)f_rows ? (int)f_rows + 1 : (int)f_rows;
565
566 /* step in x,y for each row of slice */
567 stepx = (slice->x2 - slice->x1) / f_cols;
568 stepy = (slice->y2 - slice->y1) / f_cols;
569 stepz = (slice->z2 - slice->z1) / f_rows;
570
571 /* set x,y initially to first slice pt */
572 x = (slice->x1);
573 y = (slice->y1);
574
575 /* set next draw pt */
576 if (f_cols < 1.) {
577 nextx = x + stepx * f_cols;
578 nexty = y + stepy * f_cols;
579 }
580 else {
581 nextx = x + stepx;
582 nexty = y + stepy;
583 }
584
585 /* set transparency */
586 if (slice->transp > 0) {
587 transp = (255 - slice->transp) << 24;
588 }
589 else {
590 transp = 0x0;
591 }
592
593 /* loop in slice cols */
594 for (c = 0; c < cols; c++) {
595
596 /* set z to slice z1 pt */
597 z = slice->z1;
598
599 /* begin draw one row - triangle strip */
600 gsd_bgntmesh();
601
602 /* loop in slice rows */
603 for (r = 0; r < rows + 1; r++) {
604 /* offset to data - 1. column */
605 offset = (c + 1) * (rows + 1) * 3 + r * 3;
606
607 /* get color from slice data */
608 color = (slice->data[offset] & 0xff) |
609 ((slice->data[offset + 1] & 0xff) << 8) |
610 ((slice->data[offset + 2] & 0xff) << 16);
611
612 /* triangle vertices */
613 pt[ptX] = nextx * resx;
614 pt[ptY] = nexty * resy;
615 pt[ptZ] = z * resz;
616
617 pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
618 gsd_litvert_func(n, (unsigned int)transp | color, pt);
619
620 /* offset to data - 2. column */
621 offset = c * (rows + 1) * 3 + r * 3;
622
623 /* get color from slice data */
624 color = (slice->data[offset] & 0xff) |
625 ((slice->data[offset + 1] & 0xff) << 8) |
626 ((slice->data[offset + 2] & 0xff) << 16);
627
628 /* set triangle vertices */
629 pt[ptX] = x * resx;
630 pt[ptY] = y * resy;
631 pt[ptZ] = z * resz;
632
633 pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
634 gsd_litvert_func(n, (unsigned int)transp | color, pt);
635
636 if (r + 1 > f_rows) {
637 z += stepz * (f_rows - (float)r);
638 }
639 else {
640 z += stepz;
641 }
642 }
643
644 gsd_endtmesh();
645
646 /* step */
647 if (c + 2 > f_cols) {
648 x += stepx;
649 nextx += stepx * (f_cols - (float)(c + 1));
650 y += stepy;
651 nexty += stepy * (f_cols - (float)(c + 1));
652 }
653 else {
654 x += stepx;
655 nextx += stepx;
656 y += stepy;
657 nexty += stepy;
658 }
659 }
660
661 gsd_blend(0);
662 gsd_zwritemask(0xffffffff);
663
664 return (1);
665}
666
667/*!
668 \brief Draw wire slices
669
670 \param gvl pointer to geovol struct
671
672 \return 0
673 */
675{
676 float pt[3];
677 int i;
678 int ptX, ptY, ptZ;
679 double resx, resy, resz;
680
681 geovol_slice *slice;
682
683 G_debug(5, "gvld_wire_slices");
684
686
687 /* shading */
689 /* set color mode */
691 /* do scale and set volume position */
692 gsd_do_scale(1);
693 gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
694
695 /* set color and line width */
696 gsd_color_func(0x0);
697 gsd_linewidth(1);
698
699 /* loop in slices */
700 for (i = 0; i < gvl->n_slices; i++) {
701 slice = gvl->slice[i];
702
703 /* initialize correct coords */
704 if (slice->dir == X) {
705 resx = gvl->yres;
706 resy = gvl->zres;
707 resz = gvl->xres;
708 ptX = Y;
709 ptY = Z;
710 ptZ = X;
711 }
712 else if (slice->dir == Y) {
713 resx = gvl->xres;
714 resy = gvl->zres;
715 resz = gvl->yres;
716 ptX = X;
717 ptY = Z;
718 ptZ = Y;
719 }
720 else {
721 resx = gvl->xres;
722 resy = gvl->yres;
723 resz = gvl->zres;
724 ptX = X;
725 ptY = Y;
726 ptZ = Z;
727 }
728
729 gsd_bgnline();
730
731 /* first slice edge */
732 pt[ptX] = slice->x1 * resx;
733 pt[ptY] = slice->y1 * resy;
734 pt[ptZ] = slice->z1 * resz;
735 ;
736 pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
738
739 pt[ptX] = slice->x1 * resx;
740 pt[ptY] = slice->y1 * resy;
741 pt[ptZ] = slice->z2 * resz;
742 ;
743 pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
745
746 pt[ptX] = slice->x2 * resx;
747 pt[ptY] = slice->y2 * resy;
748 pt[ptZ] = slice->z2 * resz;
749 ;
750 pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
752
753 pt[ptX] = slice->x2 * resx;
754 pt[ptY] = slice->y2 * resy;
755 pt[ptZ] = slice->z1 * resz;
756 ;
757 pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
759
760 pt[ptX] = slice->x1 * resx;
761 pt[ptY] = slice->y1 * resy;
762 pt[ptZ] = slice->z1 * resz;
763 ;
764 pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
766
767 gsd_endline();
768 }
769
770 gsd_set_material(1, 1, 0., 0., 0x0);
772
773 return (0);
774}
775
776/*!
777 \brief Draw volume bounding box
778
779 \param gvl pointer to geovol struct
780
781 \return 0
782 */
784{
785 float pt[3];
786
787 G_debug(5, "gvld_wind3_box(): id=%d", gvl->gvol_id);
788
790
791 /* shading */
793 /* set color mode */
795 /* do scale and set volume position */
796 gsd_do_scale(1);
797 gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
798
799 /* set color and line width */
800 gsd_color_func(0x0);
801 gsd_linewidth(1);
802
803 /* draw box */
804
805 /* front edges */
806 gsd_bgnline();
807 pt[X] = 0;
808 pt[Y] = 0;
809 pt[Z] = 0;
811 pt[X] = (gvl->cols - 1) * gvl->xres;
812 pt[Y] = 0;
813 pt[Z] = 0;
815 pt[X] = (gvl->cols - 1) * gvl->xres;
816 pt[Y] = (gvl->rows - 1) * gvl->yres;
817 pt[Z] = 0;
819 pt[X] = 0;
820 pt[Y] = (gvl->rows - 1) * gvl->yres;
821 pt[Z] = 0;
823 pt[X] = 0;
824 pt[Y] = 0;
825 pt[Z] = 0;
827 gsd_endline();
828
829 /* back edges */
830 gsd_bgnline();
831 pt[X] = 0;
832 pt[Y] = 0;
833 pt[Z] = (gvl->depths - 1) * gvl->zres;
835 pt[X] = (gvl->cols - 1) * gvl->xres;
836 pt[Y] = 0;
837 pt[Z] = (gvl->depths - 1) * gvl->zres;
839 pt[X] = (gvl->cols - 1) * gvl->xres;
840 pt[Y] = (gvl->rows - 1) * gvl->yres;
841 pt[Z] = (gvl->depths - 1) * gvl->zres;
843 pt[X] = 0;
844 pt[Y] = (gvl->rows - 1) * gvl->yres;
845 pt[Z] = (gvl->depths - 1) * gvl->zres;
847 pt[X] = 0;
848 pt[Y] = 0;
849 pt[Z] = (gvl->depths - 1) * gvl->zres;
851 gsd_endline();
852
853 /* others edges */
854 gsd_bgnline();
855 pt[X] = 0;
856 pt[Y] = 0;
857 pt[Z] = 0;
859 pt[X] = 0;
860 pt[Y] = 0;
861 pt[Z] = (gvl->depths - 1) * gvl->zres;
863 gsd_endline();
864
865 gsd_bgnline();
866 pt[X] = (gvl->cols - 1) * gvl->xres;
867 pt[Y] = 0;
868 pt[Z] = 0;
870 pt[X] = (gvl->cols - 1) * gvl->xres;
871 pt[Y] = 0;
872 pt[Z] = (gvl->depths - 1) * gvl->zres;
874 gsd_endline();
875
876 gsd_bgnline();
877 pt[X] = 0;
878 pt[Y] = (gvl->rows - 1) * gvl->yres;
879 pt[Z] = 0;
881 pt[X] = 0;
882 pt[Y] = (gvl->rows - 1) * gvl->yres;
883 pt[Z] = (gvl->depths - 1) * gvl->zres;
885 gsd_endline();
886
887 gsd_bgnline();
888 pt[X] = (gvl->cols - 1) * gvl->xres;
889 pt[Y] = (gvl->rows - 1) * gvl->yres;
890 pt[Z] = 0;
892 pt[X] = (gvl->cols - 1) * gvl->xres;
893 pt[Y] = (gvl->rows - 1) * gvl->yres;
894 pt[Z] = (gvl->depths - 1) * gvl->zres;
896 gsd_endline();
897
899
900 return (0);
901}
CELL_ENTRY cell_table[256]
Definition cell_table.c:3
void G_free(void *)
Free allocated memory.
Definition gis/alloc.c:145
#define G_malloc(n)
Definition defs/gis.h:136
int G_debug(int, const char *,...) __attribute__((format(printf
void gsd_endtmesh(void)
ADD.
Definition gsd_prim.c:303
void gsd_pushmatrix(void)
Push the current matrix stack.
Definition gsd_prim.c:507
void gsd_getwindow(int *, int *, double *, double *)
Get viewport.
Definition gsd_prim.c:550
void gsd_do_scale(int)
Set current scale.
Definition gsd_views.c:351
int gvl_slices_calc(geovol *)
Calculate slices for given volume set.
Definition gvl_calc.c:1034
void gsd_shademodel(int)
Set shaded model.
Definition gsd_prim.c:415
void gsd_bgnpolygon(void)
Delimit the vertices of a primitive or a group of like primitives.
Definition gsd_prim.c:368
int gvl_isosurf_calc(geovol *)
Fill data structure with computed isosurfaces polygons.
Definition gvl_calc.c:581
void gsd_color_func(unsigned int)
Set current color.
Definition gsd_prim.c:694
void gsd_translate(float, float, float)
Multiply the current matrix by a translation matrix.
Definition gsd_prim.c:535
void gsd_popmatrix(void)
Pop the current matrix stack.
Definition gsd_prim.c:497
void gsd_zwritemask(unsigned long)
Write out z-mask.
Definition gsd_prim.c:237
void gsd_linewidth(short)
Set width of rasterized lines.
Definition gsd_prim.c:263
void gsd_endline(void)
End line.
Definition gsd_prim.c:403
void gsd_colormode(int)
Set color mode.
Definition gsd_prim.c:94
void GS_get_scale(float *, float *, float *, int)
Get axis scale.
Definition gs2.c:3235
void gsd_set_material(int, int, float, float, int)
Set material.
Definition gsd_prim.c:799
void gsd_bgnline(void)
Begin line.
Definition gsd_prim.c:393
char * gvl_file_get_name(int)
Get file name for given handle.
Definition gvl_file.c:161
void gsd_blend(int)
Specify pixel arithmetic.
Definition gsd_prim.c:990
void gsd_vert_func(float *)
ADD.
Definition gsd_prim.c:682
void gsd_bgntmesh(void)
ADD.
Definition gsd_prim.c:293
int GS_check_cancel(void)
Check for cancel.
Definition gsx.c:26
void gsd_endpolygon(void)
Delimit the vertices of a primitive or a group of like primitives.
Definition gsd_prim.c:383
void gsd_litvert_func(float *, unsigned long, float *)
Set the current normal vector & specify vertex.
Definition gsd_prim.c:653
#define G_UNUSED
A macro for an attribute, if attached to a variable, indicating that the variable is not used.
Definition gis.h:43
#define DISTANCE_2(x1, y1, x2, y2)
Definition gvld.c:429
int gvld_isosurf(geovol *gvl)
Draw volume isosurfaces.
Definition gvld.c:88
int gvld_slice(geovol *gvl, int ndx)
Draw slice.
Definition gvld.c:496
int gvld_wire_slices(geovol *gvl)
Draw wire slices.
Definition gvld.c:674
int gvld_wire_isosurf(geovol *gvl)
Draw volume isosurface in draw mode.
Definition gvld.c:419
int gvld_wind3_box(geovol *gvl)
Draw volume bounding box.
Definition gvld.c:783
int gvld_slices(geovol *gvl)
Draw slices.
Definition gvld.c:439
int gvld_wire_vol(geovol *gvl)
Draw volume in wire mode (bounding box)
Definition gvld.c:65
#define READ()
Definition gvld.c:24
int gvld_vol(geovol *gvl)
Draw volume set (slices and isosurfaces)
Definition gvld.c:34
OGSF library -.
float g
Definition named_colr.c:7
OGSF header file (structures)
#define CM_DIFFUSE
Definition ogsf.h:152
#define X
Definition ogsf.h:141
#define ATT_COLOR
Definition ogsf.h:77
#define ATT_EMIT
Definition ogsf.h:81
#define Z
Definition ogsf.h:143
#define ATT_SHINE
Definition ogsf.h:80
#define Y
Definition ogsf.h:142
#define MAP_ATT
Definition ogsf.h:86
#define CM_COLOR
Definition ogsf.h:149
#define DM_GOURAUD
Definition ogsf.h:57
#define DM_FLAT
Definition ogsf.h:58
#define CONST_ATT
Definition ogsf.h:87
#define ATT_TRANSP
Definition ogsf.h:79
double b
Definition r_raster.c:37
double r
Definition r_raster.c:37
int npolys
Definition viz.h:70
int polys[30]
Definition viz.h:71
int nedges
Definition viz.h:68
int edges[12]
Definition viz.h:69
Definition ogsf.h:501
unsigned int att_src
Definition ogsf.h:472
geovol_isosurf_att att[7]
Definition ogsf.h:486
unsigned char * data
Definition ogsf.h:495
float z1
Definition ogsf.h:494
float x1
Definition ogsf.h:494
float z2
Definition ogsf.h:494
float y1
Definition ogsf.h:494
int dir
Definition ogsf.h:493
float x2
Definition ogsf.h:494
float y2
Definition ogsf.h:494
int transp
Definition ogsf.h:498
#define x