GRASS 8 Programmer's Manual 8.6.0dev(2026)-55de52a352
Loading...
Searching...
No Matches
gvl.c
Go to the documentation of this file.
1/*!
2 \file lib/ogsf/gvl.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 Bill Brown, UI-GMSL (May 1997)
13 \author Tomas Paudits (February 2004)
14 \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
15 */
16
17#include <stdlib.h>
18
19#include <grass/gis.h>
20#include <grass/ogsf.h>
21
22#include "gsget.h"
23
24#define FIRST_VOL_ID 81721
25
26static geovol *Vol_top = NULL;
27
28/*!
29 \brief Get volume set structure
30
31 \param id volume set id
32
33 \return pointer to geovol struct
34 \return NULL on failure
35 */
37{
38 geovol *gvl;
39
40 G_debug(5, "gvl_get_vol():");
41
42 for (gvl = Vol_top; gvl; gvl = gvl->next) {
43 if (gvl->gvol_id == id) {
44 G_debug(5, " id=%d", id);
45 return (gvl);
46 }
47 }
48
49 return (NULL);
50}
51
52/*!
53 \brief Get previous volume
54
55 \param id current volume set id
56
57 \return pointer to geovol struct
58 \return NULL on failure
59 */
61{
62 geovol *pv;
63
64 G_debug(5, "gvl_get_prev_vol");
65
66 for (pv = Vol_top; pv; pv = pv->next) {
67 if (pv->gvol_id == id - 1) {
68 return (pv);
69 }
70 }
71
72 return (NULL);
73}
74
75/*!
76 \brief Get all volumes
77
78 \param[out] gvols list of geovol structs
79
80 \return number of available volume sets
81 */
83{
84 geovol *gvl;
85 int i;
86
87 G_debug(5, "gvl_getall_vols");
88
89 for (i = 0, gvl = Vol_top; gvl; gvl = gvl->next, i++) {
90 gvols[i] = gvl;
91 }
92
93 return (i);
94}
95
96/*!
97 \brief Get number of loaded volume sets
98
99 \return number of volumes
100 */
102{
103 geovol *gvl;
104 int i;
105
106 for (i = 0, gvl = Vol_top; gvl; gvl = gvl->next, i++)
107 ;
108
109 G_debug(5, "gvl_num_vols(): num=%d", i);
110
111 return (i);
112}
113
114/*!
115 \brief Get last volume set from the list
116
117 \return pointer to geovol struct
118 \return NULL on failure
119 */
121{
122 geovol *lvl;
123
124 G_debug(5, "gvl_get_last_vol");
125
126 if (!Vol_top) {
127 return (NULL);
128 }
129
130 for (lvl = Vol_top; lvl->next; lvl = lvl->next)
131 ;
132
133 G_debug(5, " last vol id: %d", lvl->gvol_id);
134
135 return (lvl);
136}
137
138/*!
139 \brief Allocate new volume set and add it to the list
140
141 \return pointer to geovol struct
142 \return NULL on failure
143 */
145{
146 geovol *nvl, *lvl;
147
148 G_debug(5, "gvl_get_new_vol()");
149
150 nvl = (geovol *)G_malloc(sizeof(geovol)); /* G_fatal_error */
151 if (!nvl) {
152 return (NULL);
153 }
154
155 if ((lvl = gvl_get_last_vol())) {
156 lvl->next = nvl;
157 nvl->gvol_id = lvl->gvol_id + 1;
158 }
159 else {
160 Vol_top = nvl;
161 nvl->gvol_id = FIRST_VOL_ID;
162 }
163
164 nvl->next = NULL;
165
166 G_debug(5, " id=%d", nvl->gvol_id);
167
168 return (nvl);
169}
170
171/*!
172 \brief Initialize geovol structure
173
174 \param gvl pointer to geovol struct
175 \param ox,oy,oz
176 \param rows number of rows
177 \param cols number of cols
178 \param xres,yres,zres x/y/z resolution value
179
180 \return -1 on failure
181 \return 1 on success
182 */
183int gvl_init_vol(geovol *gvl, double ox, double oy, double oz, int rows,
184 int cols, int depths, double xres, double yres, double zres)
185{
186 G_debug(5, "gvl_init_vol() id=%d", gvl->gvol_id);
187
188 if (!gvl) {
189 return (-1);
190 }
191
192 gvl->ox = ox;
193 gvl->oy = oy;
194 gvl->oz = oz;
195 gvl->rows = rows;
196 gvl->cols = cols;
197 gvl->depths = depths;
198 gvl->xres = xres;
199 gvl->yres = yres;
200 gvl->zres = zres;
201
202 gvl->xmin = ox;
203 gvl->xmax = ox + (cols - 1) * xres;
204 gvl->xrange = gvl->xmax - gvl->xmin;
205 gvl->ymin = oy;
206 gvl->ymax = oy + (rows - 1) * yres;
207 gvl->yrange = gvl->ymax - gvl->ymin;
208 gvl->zmin = oz;
209 gvl->zmax = oz + (depths - 1) * zres;
210 gvl->zrange = gvl->zmax - gvl->zmin;
211
212 gvl->x_trans = gvl->y_trans = gvl->z_trans = 0.0;
213 gvl->draw_wire = 0;
214
215 gvl->n_isosurfs = 0;
216 G_zero(gvl->isosurf, sizeof(geovol_isosurf *) * MAX_ISOSURFS);
217 gvl->isosurf_x_mod = 1;
218 gvl->isosurf_y_mod = 1;
219 gvl->isosurf_z_mod = 1;
220 gvl->isosurf_draw_mode = DM_GOURAUD;
221
222 gvl->n_slices = 0;
223 G_zero(gvl->slice, sizeof(geovol_slice *) * MAX_SLICES);
224 gvl->slice_x_mod = 1;
225 gvl->slice_y_mod = 1;
226 gvl->slice_z_mod = 1;
227 gvl->slice_draw_mode = DM_GOURAUD;
228
229 gvl->hfile = -1;
230 gvl->clientdata = NULL;
231
232 return (1);
233}
234
235/*!
236 \brief Remove volume set from list
237
238 \param id volume set id
239 */
240void gvl_delete_vol(int id)
241{
242 geovol *fvl;
243
244 G_debug(5, "gvl_delete_vol");
245
246 fvl = gvl_get_vol(id);
247
248 if (fvl) {
250 }
251
252 return;
253}
254
255/*!
256 \brief Free geovol struct
257
258 \param fvl pointer to geovol struct
259
260 \return -1 on failure
261 \return 1 on success
262 */
264{
265 geovol *gvl;
266 int found = 0;
267
268 G_debug(5, "gvl_free_vol");
269
270 if (Vol_top) {
271 if (fvl == Vol_top) {
272 if (Vol_top->next) {
273 /* can't free top if last */
274 found = 1;
275 Vol_top = fvl->next;
276 }
277 else {
279 G_free(fvl);
280 Vol_top = NULL;
281 }
282 }
283 else {
284 for (gvl = Vol_top; gvl && !found; gvl = gvl->next) {
285 /* can't free top */
286 if (gvl->next) {
287 if (gvl->next == fvl) {
288 found = 1;
289 gvl->next = fvl->next;
290 }
291 }
292 }
293 }
294
295 if (found) {
297 G_free(fvl);
298 fvl = NULL;
299 }
300
301 return (1);
302 }
303
304 return (-1);
305}
306
307/*!
308 \brief Free geovol struct memory
309
310 \param fvl pointer to geovol struct
311 */
313{
314 if (0 < fvl->hfile)
315 gvl_file_free_datah(fvl->hfile);
316
317 return;
318}
319
320/*!
321 \brief Debug volume fields
322
323 \param gvl pointer to geovol struct
324 */
326{
327 G_debug(5, "ID: %d", gvl->gvol_id);
328 G_debug(5, "cols: %d rows: %d depths: %d", gvl->cols, gvl->rows,
329 gvl->depths);
330 G_debug(5, "ox: %lf oy: %lf oz: %lf", gvl->ox, gvl->oy, gvl->oz);
331 G_debug(5, "xres: %lf yres: %lf zres: %lf", gvl->xres, gvl->yres,
332 gvl->zres);
333 G_debug(5, "xmin: %f ymin: %f zmin: %f", gvl->xmin, gvl->ymin, gvl->zmin);
334 G_debug(5, "xmax: %f ymax: %f zmax: %f", gvl->xmax, gvl->ymax, gvl->zmax);
335 G_debug(5, "x_trans: %f y_trans: %f z_trans: %f", gvl->x_trans,
336 gvl->y_trans, gvl->z_trans);
337
338 return;
339}
340
341/*!
342 \brief Get volume x-extent value
343
344 \param gvl pointer to geovol struct
345 \param[out] min x-min value
346 \param[out] max y-max value
347
348 \return 1
349 */
350int gvl_get_xextents(geovol *gvl, float *min, float *max)
351{
352 *min = gvl->xmin + gvl->x_trans;
353 *max = gvl->xmax + gvl->x_trans;
354
355 return (1);
356}
357
358/*!
359 \brief Get volume y-extent value
360
361 \param gvl pointer to geovol struct
362 \param[out] min y-min value
363 \param[out] max y-max value
364
365 \return 1
366 */
367int gvl_get_yextents(geovol *gvl, float *min, float *max)
368{
369 *min = gvl->ymin + gvl->y_trans;
370 *max = gvl->ymax + gvl->y_trans;
371
372 return (1);
373}
374
375/*!
376 \brief Get volume z-extent value
377
378 \param gvl pointer to geovol struct
379 \param[out] min z-min value
380 \param[out] max z-max value
381
382 \return 1
383 */
384int gvl_get_zextents(geovol *gvl, float *min, float *max)
385{
386 *min = gvl->zmin + gvl->z_trans;
387 *max = gvl->zmax + gvl->z_trans;
388
389 return (1);
390}
391
392/*!
393 \brief Get volume x-range value
394
395 \param[out] min x-min value
396 \param[out] max x-max value
397
398 \return 1
399 */
400int gvl_get_xrange(float *min, float *max)
401{
402 geovol *gvl;
403 float tmin, tmax;
404
405 if (Vol_top) {
406 gvl_get_xextents(Vol_top, &tmin, &tmax);
407 *min = tmin;
408 *max = tmax;
409 }
410 else {
411 return (-1);
412 }
413
414 for (gvl = Vol_top->next; gvl; gvl = gvl->next) {
416
417 if (tmin < *min) {
418 *min = tmin;
419 }
420
421 if (tmax > *max) {
422 *max = tmax;
423 }
424 }
425
426 return (1);
427}
428
429/*!
430 \brief Get volume y-range value
431
432 \param[out] min y-min value
433 \param[out] max y-max value
434
435 \return 1
436 */
437int gvl_get_yrange(float *min, float *max)
438{
439 geovol *gvl;
440 float tmin, tmax;
441
442 if (Vol_top) {
443 gvl_get_yextents(Vol_top, &tmin, &tmax);
444 *min = tmin;
445 *max = tmax;
446 }
447 else {
448 return (-1);
449 }
450
451 for (gvl = Vol_top->next; gvl; gvl = gvl->next) {
453
454 if (tmin < *min) {
455 *min = tmin;
456 }
457
458 if (tmax > *max) {
459 *max = tmax;
460 }
461 }
462
463 return (1);
464}
465
466/*!
467 \brief Get volume z-range value
468
469 \param[out] min z-min value
470 \param[out] max z-max value
471
472 \return 1
473 */
474int gvl_get_zrange(float *min, float *max)
475{
476 geovol *gvl;
477 float tmin, tmax;
478
479 if (Vol_top) {
480 gvl_get_zextents(Vol_top, &tmin, &tmax);
481 *min = tmin;
482 *max = tmax;
483 }
484 else {
485 return (-1);
486 }
487
488 for (gvl = Vol_top->next; gvl; gvl = gvl->next) {
490
491 if (tmin < *min) {
492 *min = tmin;
493 }
494
495 if (tmax > *max) {
496 *max = tmax;
497 }
498 }
499
500 return (1);
501}
502
503/************************************************************************/
504/* ISOSURFACES */
505
506/************************************************************************/
507
508/*!
509 \brief Initialize geovol_isosurf struct
510
511 \param isosurf pointer to geovol_isosurf struct
512
513 \return -1 on failure
514 \return 1 on success
515 */
517{
518 int i;
519
520 G_debug(5, "gvl_isosurf_init");
521
522 if (!isosurf)
523 return (-1);
524
525 for (i = 0; i < MAX_ATTS; i++) {
526 isosurf->att[i].att_src = NOTSET_ATT;
527 isosurf->att[i].constant = 0.;
528 isosurf->att[i].hfile = -1;
529 isosurf->att[i].user_func = NULL;
530 isosurf->att[i].att_data = NULL;
531 isosurf->att[i].changed = 0;
532 }
533
534 isosurf->data = NULL;
535 isosurf->data_desc = 0;
536 isosurf->inout_mode = 0;
537
538 return (1);
539}
540
541/*!
542 \brief Free geovol_isosurf struct
543
544 \param isosurf pointer to geovol_isosurf struct
545
546 \return -1 on failure
547 \return 1 on success
548 */
550{
551 int i;
552
553 G_debug(5, "gvl_isosurf_freemem");
554
555 if (!isosurf)
556 return (-1);
557
558 for (i = 0; i < MAX_ATTS; i++) {
560 }
561
562 G_free(isosurf->data);
563
564 return (1);
565}
566
567/*!
568 \brief Get isosurface of given volume set
569
570 \param id volume set id
571 \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
572
573 \return pointer to geovol_isosurf struct
574 \return NULL on failure
575 */
577{
578 geovol *gvl;
579
580 G_debug(5, "gvl_isosurf_get_isosurf(): id=%d isosurf=%d", id, isosurf_id);
581
582 gvl = gvl_get_vol(id);
583
584 if (gvl) {
585 if ((isosurf_id < 0) || (isosurf_id > (gvl->n_isosurfs - 1)))
586 return (NULL);
587
588 return gvl->isosurf[isosurf_id];
589 }
590
591 return (NULL);
592}
593
594/*!
595 \brief Get attribute source
596
597 \param isosurf pointer to geovol_isosurf struct
598 \param desc attribute id
599
600 \return -1 on failure
601 \return attribute value
602 */
604{
605 G_debug(5, "isosurf_get_att_src");
606
607 if (!LEGAL_ATT(desc)) {
608 return (-1);
609 }
610
611 if (isosurf) {
612 return (isosurf->att[desc].att_src);
613 }
614
615 return (-1);
616}
617
618/*!
619 \brief Set attribute source
620
621 \param isosurf pointer to geovol_isosurf struct
622 \param desc attribute id
623 \param src attribute value
624
625 \return -1 on failure
626 \return 1 on success
627 */
628int gvl_isosurf_set_att_src(geovol_isosurf *isosurf, int desc, int src)
629{
630 G_debug(5, "gvl_isosurf_set_att_src");
631
632 /* check if old source was MAP_ATT, detach volfile */
633 if (MAP_ATT == gvl_isosurf_get_att_src(isosurf, desc)) {
634 gvl_file_free_datah(isosurf->att[desc].hfile);
635
636 if (desc == ATT_COLOR) {
637 Gvl_unload_colors_data(isosurf->att[desc].att_data);
638 }
639 }
640
641 if (isosurf && LEGAL_SRC(src)) {
642 isosurf->att[desc].att_src = src;
643 gvl_isosurf_set_att_changed(isosurf, desc);
644
645 return (1);
646 }
647
648 return (-1);
649}
650
651/*!
652 \brief Set isosurface attribute constant
653
654 \param isosurf pointer to geovol_isosurf struct
655 \param desc attribute descriptor
656 \param constant attribute value
657
658 \return -1 on failure
659 \return 1 on success
660 */
661int gvl_isosurf_set_att_const(geovol_isosurf *isosurf, int desc, float constant)
662{
663 G_debug(5, "gvl_isosurf_set_att_const(): att=%d, const=%f", desc, constant);
664
665 if (isosurf) {
666 isosurf->att[desc].constant = constant;
667
668 gvl_isosurf_set_att_src(isosurf, desc, CONST_ATT);
669
670 return (1);
671 }
672
673 return (-1);
674}
675
676/*!
677 \brief Set attribute map
678
679 \param isosurf pointer to geovol_isosurf struct
680 \param desc attribute id
681 \param filename filename
682
683 \return -1 on failure
684 \return 1 on success
685 */
687 const char *filename)
688{
689 int hfile;
690
691 G_debug(5, "gvl_isosurf_set_att_map(): att=%d map=%s", desc, filename);
692
693 if (isosurf) {
694 if (0 > (hfile = gvl_file_newh(filename, VOL_FTYPE_RASTER3D)))
695 return (-1);
696
697 gvl_isosurf_set_att_src(isosurf, desc, MAP_ATT);
698
699 isosurf->att[desc].hfile = hfile;
700
701 if (ATT_COLOR == desc) {
702 Gvl_load_colors_data(&(isosurf->att[desc].att_data), filename);
703 }
704 return (1);
705 }
706
707 return (-1);
708}
709
710/*!
711 \brief Set attribute changed
712
713 \param isosurf pointer to geovol_isosurf struct
714 \param desc attribute id
715
716 \return -1 on failure
717 \return 1 on success
718 */
720{
721 int i;
722
723 G_debug(5, "gvl_isosurf_set_att_changed");
724
725 if (isosurf && LEGAL_ATT(desc)) {
726 isosurf->att[desc].changed = 1;
727
728 if ((desc == ATT_TOPO) || (desc == ATT_MASK)) {
729 for (i = 1; i < MAX_ATTS; i++)
730 isosurf->att[i].changed = 1;
731 }
732
733 return (1);
734 }
735
736 return (-1);
737}
738
739/************************************************************************/
740/* SLICES */
741
742/************************************************************************/
743
744/*!
745 \brief Initialize geovol_slice struct
746
747 \param slice pointer to geovol_slice struct
748
749 \return -1 on failure
750 \return 1 on success
751 */
753{
754 G_debug(5, "gvl_slice_init");
755
756 if (!slice)
757 return (-1);
758
759 slice->data = NULL;
760 slice->changed = 0;
761 slice->mode = 1;
762 slice->transp = 0;
763
764 slice->z1 = 0;
765 slice->z2 = 99;
766
767 return (1);
768}
769
770/*!
771 \brief Free geovol_slice struct
772
773 \param slice pointer to geovol_slice struct
774
775 \return -1 on failure
776 \return 1 on success
777 */
779{
780 G_debug(5, "gvl_slice_freemem");
781
782 if (!slice)
783 return (-1);
784
785 G_free(slice->data);
786
787 return (1);
788}
789
790/*!
791 \brief Get geovol_slice struct
792
793 \param id volume set id
794 \param slice_id slice id
795
796 \return pointer to geovol_slice struct
797 \return NULL on failure
798 */
800{
801 geovol *gvl;
802
803 gvl = gvl_get_vol(id);
804
805 if (gvl) {
806 if ((slice_id < 0) || (slice_id > (gvl->n_slices - 1)))
807 return (NULL);
808
809 return gvl->slice[slice_id];
810 }
811
812 return (NULL);
813}
#define NULL
Definition ccmath.h:32
void G_zero(void *, int)
Zero out a buffer, buf, of length i.
Definition gis/zero.c:21
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
int gvl_file_newh(const char *, IFLAG)
int Gvl_load_colors_data(void **, const char *)
Load color table.
Definition gvl3.c:30
int Gvl_unload_colors_data(void *)
Unload color table.
Definition gvl3.c:61
int gvl_file_free_datah(int)
Free geovol_file structure for given handle.
Definition gvl_file.c:360
#define min(x, y)
Definition draw2.c:29
#define max(x, y)
Definition draw2.c:30
void gvl_free_volmem(geovol *fvl)
Free geovol struct memory.
Definition gvl.c:312
geovol * gvl_get_new_vol(void)
Allocate new volume set and add it to the list.
Definition gvl.c:144
int gvl_get_yrange(float *min, float *max)
Get volume y-range value.
Definition gvl.c:437
int gvl_get_xextents(geovol *gvl, float *min, float *max)
Get volume x-extent value.
Definition gvl.c:350
int gvl_isosurf_init(geovol_isosurf *isosurf)
Initialize geovol_isosurf struct.
Definition gvl.c:516
int gvl_init_vol(geovol *gvl, double ox, double oy, double oz, int rows, int cols, int depths, double xres, double yres, double zres)
Initialize geovol structure.
Definition gvl.c:183
geovol * gvl_get_prev_vol(int id)
Get previous volume.
Definition gvl.c:60
int gvl_getall_vols(geovol **gvols)
Get all volumes.
Definition gvl.c:82
void print_vol_fields(geovol *gvl)
Debug volume fields.
Definition gvl.c:325
int gvl_isosurf_set_att_map(geovol_isosurf *isosurf, int desc, const char *filename)
Set attribute map.
Definition gvl.c:686
int gvl_slice_freemem(geovol_slice *slice)
Free geovol_slice struct.
Definition gvl.c:778
geovol * gvl_get_vol(int id)
Get volume set structure.
Definition gvl.c:36
int gvl_isosurf_get_att_src(geovol_isosurf *isosurf, int desc)
Get attribute source.
Definition gvl.c:603
int gvl_isosurf_freemem(geovol_isosurf *isosurf)
Free geovol_isosurf struct.
Definition gvl.c:549
geovol_slice * gvl_slice_get_slice(int id, int slice_id)
Get geovol_slice struct.
Definition gvl.c:799
geovol_isosurf * gvl_isosurf_get_isosurf(int id, int isosurf_id)
Get isosurface of given volume set.
Definition gvl.c:576
int gvl_get_zrange(float *min, float *max)
Get volume z-range value.
Definition gvl.c:474
int gvl_isosurf_set_att_src(geovol_isosurf *isosurf, int desc, int src)
Set attribute source.
Definition gvl.c:628
#define FIRST_VOL_ID
Definition gvl.c:24
int gvl_get_xrange(float *min, float *max)
Get volume x-range value.
Definition gvl.c:400
int gvl_isosurf_set_att_changed(geovol_isosurf *isosurf, int desc)
Set attribute changed.
Definition gvl.c:719
int gvl_get_zextents(geovol *gvl, float *min, float *max)
Get volume z-extent value.
Definition gvl.c:384
int gvl_isosurf_set_att_const(geovol_isosurf *isosurf, int desc, float constant)
Set isosurface attribute constant.
Definition gvl.c:661
geovol * gvl_get_last_vol(void)
Get last volume set from the list.
Definition gvl.c:120
int gvl_get_yextents(geovol *gvl, float *min, float *max)
Get volume y-extent value.
Definition gvl.c:367
int gvl_slice_init(geovol_slice *slice)
Initialize geovol_slice struct.
Definition gvl.c:752
void gvl_delete_vol(int id)
Remove volume set from list.
Definition gvl.c:240
int gvl_num_vols(void)
Get number of loaded volume sets.
Definition gvl.c:101
int gvl_free_vol(geovol *fvl)
Free geovol struct.
Definition gvl.c:263
OGSF header file (structures)
#define NOTSET_ATT
Definition ogsf.h:85
#define ATT_MASK
Definition ogsf.h:78
#define MAX_ATTS
Definition ogsf.h:46
#define MAX_ISOSURFS
Definition ogsf.h:49
#define ATT_TOPO
Definition ogsf.h:76
#define ATT_COLOR
Definition ogsf.h:77
#define LEGAL_ATT(a)
Definition ogsf.h:82
#define MAP_ATT
Definition ogsf.h:86
#define LEGAL_SRC(s)
Definition ogsf.h:89
#define DM_GOURAUD
Definition ogsf.h:57
#define VOL_FTYPE_RASTER3D
Definition ogsf.h:132
#define CONST_ATT
Definition ogsf.h:87
#define MAX_SLICES
Definition ogsf.h:50
Definition ogsf.h:501
struct g_vol * next
Definition ogsf.h:503
int gvol_id
Definition ogsf.h:502
void * att_data
Definition ogsf.h:480
int(* user_func)(void)
Definition ogsf.h:477
unsigned int att_src
Definition ogsf.h:472
unsigned char * data
Definition ogsf.h:489
geovol_isosurf_att att[7]
Definition ogsf.h:486
int inout_mode
Definition ogsf.h:485
int data_desc
Definition ogsf.h:488
unsigned char * data
Definition ogsf.h:495
float z1
Definition ogsf.h:494
float z2
Definition ogsf.h:494
int changed
Definition ogsf.h:496
int mode
Definition ogsf.h:498
int transp
Definition ogsf.h:498