GRASS 8 Programmer's Manual 8.6.0dev(2026)-79cd2b35f7
Loading...
Searching...
No Matches
gsd_prim.c
Go to the documentation of this file.
1/*!
2 \file lib/ogsf/gsd_prim.c
3
4 \brief OGSF library - primitive drawing functions (lower level functions)
5
6 GRASS OpenGL gsurf OGSF Library
7
8 SPDX-FileCopyrightText: 1999-2008, 2018 GRASS Development Team
9 SPDX-License-Identifier: GPL-2.0-or-later
10
11 \author Bill Brown USACERL (January 1993)
12 \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
13 \author Support for framebuffer objects by Huidae Cho <grass4u gmail.com>
14 (July 2018)
15 */
16
17#include <stdlib.h>
18#include <string.h>
19
20#include <grass/config.h>
21
22#if defined(OPENGL_X11)
23#include <GL/gl.h>
24#include <GL/glu.h>
25#include <GL/glx.h>
26#elif defined(OPENGL_AQUA)
27#include <OpenGL/gl.h>
28#include <OpenGL/glu.h>
29#if defined(OPENGL_AGL)
30#include <AGL/agl.h>
31#endif
32#elif defined(OPENGL_WINDOWS)
33#define WIN32_LEAN_AND_MEAN
34#include <windows.h>
35#undef WIN32_LEAN_AND_MEAN
36#include <GL/gl.h>
37#include <GL/glu.h>
38#include <wingdi.h>
39#endif
40
41#include <grass/gis.h>
42#include <grass/ogsf.h>
43#include <grass/glocale.h>
44
45#define USE_GL_NORMALIZE
46
47#define RED_MASK 0x000000FF
48#define GRN_MASK 0x0000FF00
49#define BLU_MASK 0x00FF0000
50#define ALP_MASK 0xFF000000
51
52#define INT_TO_RED(i, r) (r = (i & RED_MASK))
53#define INT_TO_GRN(i, g) (g = (i & GRN_MASK) >> 8)
54#define INT_TO_BLU(i, b) (b = (i & BLU_MASK) >> 16)
55#define INT_TO_ALP(i, a) (a = (i & ALP_MASK) >> 24)
56
57#define MAX_OBJS 64
58/* ^ TMP - move to gstypes */
59
60/* define border width (pixels) for viewport check */
61#define border 15
62
63static GLuint ObjList[MAX_OBJS];
64static int numobjs = 0;
65
66static int Shade;
67
68static float ogl_light_amb[MAX_LIGHTS][4];
69static float ogl_light_diff[MAX_LIGHTS][4];
70static float ogl_light_spec[MAX_LIGHTS][4];
71static float ogl_light_pos[MAX_LIGHTS][4];
72static float ogl_mat_amb[4];
73static float ogl_mat_diff[4];
74static float ogl_mat_spec[4];
75static float ogl_mat_emis[4];
76static float ogl_mat_shin;
77
78/*!
79 \brief Mostly for flushing drawing commands across a network
80
81 glFlush doesn't block, so if blocking is desired use glFinish.
82 */
83void gsd_flush(void)
84{
85 glFlush();
86
87 return;
88}
89
90/*!
91 \brief Set color mode
92
93 Call glColorMaterial before enabling the GL_COLOR_MATERIAL
94
95 \param cm color mode value
96 */
98{
99 switch (cm) {
100 case CM_COLOR:
101
104
105 break;
106 case CM_EMISSION:
107
111
112 break;
113 case CM_DIFFUSE:
114
118
119 break;
120 case CM_AD:
121
125
126 break;
127 case CM_NULL:
128
129 /* OGLXXX
130 * lmcolor: if LMC_NULL, use:
131 * glDisable(GL_COLOR_MATERIAL);
132 * LMC_NULL: use glDisable(GL_COLOR_MATERIAL);
133 */
136
137 break;
138 default:
139
141 break;
142 }
143
144 return;
145}
146
147/*!
148 \brief Print color mode to stderr
149 */
151{
152 GLint mat;
153
155 G_message(_("Color Material: %d"), mat);
156
157 return;
158}
159
160/*!
161 \brief ADD
162
163 \param x,y
164 \param rad
165 */
166void gsd_circ(float x, float y, float rad)
167{
169
171 glPushMatrix();
172 glTranslatef(x, y, 0.);
173 gluDisk(qobj, 0., rad, 32, 1);
174 glPopMatrix();
176
177 return;
178}
179
180/*!
181 \brief ADD
182
183 \param x,y,z
184 \param rad
185 */
186void gsd_disc(float x, float y, float z, float rad)
187{
189
191 glPushMatrix();
192 glTranslatef(x, y, z);
193 gluDisk(qobj, 0., rad, 32, 1);
194 glPopMatrix();
196
197 return;
198}
199
200/*!
201 \brief ADD
202
203 \param center center-point
204 \param siz size value
205 */
206void gsd_sphere(float *center, float siz)
207{
208 static int first = 1;
209 static GLUquadricObj *QOsphere;
210
211 if (first) {
213
214 if (QOsphere) {
215 gluQuadricNormals(QOsphere, GLU_SMOOTH); /* default */
216 gluQuadricTexture(QOsphere, GL_FALSE); /* default */
219 }
220
221 first = 0;
222 }
223
224 glPushMatrix();
225 glTranslatef(center[0], center[1], center[2]);
226 gluSphere(QOsphere, (double)siz, 24, 24);
227 glPopMatrix();
228
229 return;
230}
231
232/*!
233 \brief Write out z-mask
234
235 Enable or disable writing into the depth buffer
236
237 \param n Specifies whether the depth buffer is enabled for
238 writing
239 */
240void gsd_zwritemask(unsigned long n)
241{
242 /* OGLXXX glDepthMask is boolean only */
244
245 return;
246}
247
248/*!
249 \brief ADD
250
251 \param n
252 */
253void gsd_backface(int n)
254{
257
258 return;
259}
260
261/*!
262 \brief Set width of rasterized lines
263
264 \param n line width
265 */
266void gsd_linewidth(short n)
267{
268 glLineWidth((GLfloat)(n));
269
270 return;
271}
272
273/*!
274 \brief ADD
275 */
277{
279
280 return;
281}
282
283/*!
284 \brief ADD
285 */
287{
288 glEnd();
289
290 return;
291}
292
293/*!
294 \brief ADD
295 */
296void gsd_bgntmesh(void)
297{
299
300 return;
301}
302
303/*!
304 \brief ADD
305 */
306void gsd_endtmesh(void)
307{
308 glEnd();
309
310 return;
311}
312
313/*!
314 \brief ADD
315 */
317{
319
320 return;
321}
322
323/*!
324 \brief ADD
325 */
327{
328 glEnd();
329
330 return;
331}
332
333/*!
334 \brief ADD
335 */
336void gsd_bgntfan(void)
337{
339
340 return;
341}
342
343/*!
344 \brief ADD
345 */
346void gsd_endtfan(void)
347{
348 glEnd();
349
350 return;
351}
352
353/*!
354 \brief ADD
355 */
357{
358 /* OGLXXX
359 * swaptmesh not supported, maybe glBegin(GL_TRIANGLE_FAN)
360 * swaptmesh()
361 */
362
363 /*DELETED*/;
364
365 return;
366}
367
368/*!
369 \brief Delimit the vertices of a primitive or a group of like primitives
370 */
372{
373 /* OGLXXX
374 * special cases for polygons:
375 * independent quads: use GL_QUADS
376 * independent triangles: use GL_TRIANGLES
377 */
379
380 return;
381}
382
383/*!
384 \brief Delimit the vertices of a primitive or a group of like primitives
385 */
387{
388 glEnd();
389
390 return;
391}
392
393/*!
394 \brief Begin line
395 */
396void gsd_bgnline(void)
397{
398 /* OGLXXX for multiple, independent line segments: use GL_LINES */
400 return;
401}
402
403/*!
404 \brief End line
405 */
406void gsd_endline(void)
407{
408 glEnd();
409
410 return;
411}
412
413/*!
414 \brief Set shaded model
415
416 \param shade non-zero for GL_SMOOTH otherwise GL_FLAT
417 */
419{
420 Shade = shade;
421
422 if (shade) {
424 }
425 else {
427 }
428
429 return;
430}
431
432/*!
433 \brief Get shaded model
434
435 \return shade
436 */
438{
439 return (Shade);
440}
441
442/*!
443 \brief Draw to the front and back buffers
444 */
446{
447#if !defined(OPENGL_FBO)
448 /* OGLXXX bothbuffer: other possibilities include GL_FRONT, GL_BACK */
450#endif
451 return;
452}
453
454/*!
455 \brief Draw to the front buffer
456 */
458{
459#if !defined(OPENGL_FBO)
460 /* OGLXXX frontbuffer: other possibilities include GL_FRONT_AND_BACK */
462#endif
463 return;
464}
465
466/*!
467 \brief Draw to the back buffer
468 */
470{
471#if !defined(OPENGL_FBO)
472 /* OGLXXX backbuffer: other possibilities include GL_FRONT_AND_BACK */
474#endif
475 return;
476}
477
478/*!
479 \brief Swap buffers
480 */
482{
483#if !defined(OPENGL_FBO)
484 /* OGLXXX swapbuffers: copy the back buffer to the front;
485 * the back buffer becomes undefined afterward */
486#if defined(OPENGL_X11)
488#elif defined(OPENGL_AGL)
490#elif defined(OPENGL_WINDOWS)
492#endif
493#endif
494 return;
495}
496
497/*!
498 \brief Pop the current matrix stack
499 */
501{
502 glPopMatrix();
503
504 return;
505}
506
507/*!
508 \brief Push the current matrix stack
509 */
511{
512 glPushMatrix();
513
514 return;
515}
516
517/*!
518 \brief Multiply the current matrix by a general scaling matrix
519
520 \param xs x scale value
521 \param ys y scale value
522 \param zs z scale value
523 */
524void gsd_scale(float xs, float ys, float zs)
525{
526 glScalef(xs, ys, zs);
527
528 return;
529}
530
531/*!
532 \brief Multiply the current matrix by a translation matrix
533
534 \param dx x translation value
535 \param dy y translation value
536 \param dz z translation value
537 */
538void gsd_translate(float dx, float dy, float dz)
539{
540 glTranslatef(dx, dy, dz);
541
542 return;
543}
544
545/*!
546 \brief Get viewport
547
548 \param[out] window
549 \param viewport
550 \param modelMatrix model matrix
551 \param projMatrix projection matrix
552 */
553void gsd_getwindow(int *window, int *viewport, double *modelMatrix,
554 double *projMatrix)
555{
557 gsd_do_scale(1);
558
563
564 window[0] = viewport[1] + viewport[3] + border;
565 window[1] = viewport[1] - border;
566 window[2] = viewport[0] - border;
567 window[3] = viewport[0] + viewport[2] + border;
568
569 return;
570}
571
572/*!
573 \brief ADD
574
575 \param pt
576 \param window
577 \param viewport
578 \param doubleMatrix
579 \param projMatrix
580
581 \return 0
582 \return 1
583 */
584int gsd_checkpoint(float pt[4], int window[4], int viewport[4],
585 double modelMatrix[16], double projMatrix[16])
586{
587 GLdouble fx, fy, fz;
588
590 projMatrix, viewport, &fx, &fy, &fz);
591
592 if (fx < window[2] || fx > window[3] || fy < window[1] || fy > window[0])
593 return 1;
594 else
595 return 0;
596}
597
598/*!
599 \brief ADD
600
601 \param angle
602 \param axis
603 */
604void gsd_rot(float angle, char axis)
605{
606 GLfloat x;
607 GLfloat y;
608 GLfloat z;
609
610 switch (axis) {
611 case 'x':
612 case 'X':
613
614 x = 1.0;
615 y = 0.0;
616 z = 0.0;
617
618 break;
619 case 'y':
620 case 'Y':
621
622 x = 0.0;
623 y = 1.0;
624 z = 0.0;
625
626 break;
627 case 'z':
628 case 'Z':
629
630 x = 0.0;
631 y = 0.0;
632 z = 1.0;
633
634 break;
635 default:
636
637 G_warning(_("gsd_rot(): %c is an invalid axis "
638 "specification. Rotation ignored. "
639 "Please advise GRASS developers of this error"),
640 axis);
641 return;
642 }
643
644 glRotatef((GLfloat)angle, x, y, z);
645
646 return;
647}
648
649/*!
650 \brief Set the current normal vector & specify vertex
651
652 \param norm normal vector
653 \param col color value
654 \param pt point (model coordinates)
655 */
656void gsd_litvert_func(float *norm, unsigned long col, float *pt)
657{
658 glNormal3fv(norm);
661
662 return;
663}
664
665/*!
666 \brief ADD
667
668 \param norm
669 \param col [unused]
670 \param pt
671 */
672void gsd_litvert_func2(float *norm, unsigned long col G_UNUSED, float *pt)
673{
674 glNormal3fv(norm);
676
677 return;
678}
679
680/*!
681 \brief ADD
682
683 \param pt
684 */
685void gsd_vert_func(float *pt)
686{
688
689 return;
690}
691
692/*!
693 \brief Set current color
694
695 \param col color value
696 */
697void gsd_color_func(unsigned int col)
698{
699 GLbyte r, g, b, a;
700
701 /* OGLXXX
702 * cpack: if argument is not a variable
703 * might need to be:
704 * glColor4b(($1)&0xff, ($1)>>8&0xff, ($1)>>16&0xff, ($1)>>24&0xff)
705 */
706 INT_TO_RED(col, r);
707 INT_TO_GRN(col, g);
708 INT_TO_BLU(col, b);
709 INT_TO_ALP(col, a);
710 glColor4ub(r, g, b, a);
711
712 return;
713}
714
715/*!
716 \brief Initialize model light
717 */
719{
720
722
723 /* normal vector renormalization */
724#ifdef USE_GL_NORMALIZE
725 {
727 }
728#endif
729
730 /* OGLXXX
731 * Ambient:
732 * If this is a light model lmdef, then use
733 * glLightModelf and GL_LIGHT_MODEL_AMBIENT.
734 * Include ALPHA parameter with ambient
735 */
736
737 /* Default is front face lighting, infinite viewer
738 */
739 ogl_mat_amb[0] = 0.1;
740 ogl_mat_amb[1] = 0.1;
741 ogl_mat_amb[2] = 0.1;
742 ogl_mat_amb[3] = 1.0;
743
744 ogl_mat_diff[0] = 0.8;
745 ogl_mat_diff[1] = 0.8;
746 ogl_mat_diff[2] = 0.8;
747 ogl_mat_diff[3] = 0.8;
748
749 ogl_mat_spec[0] = 0.8;
750 ogl_mat_spec[1] = 0.8;
751 ogl_mat_spec[2] = 0.8;
752 ogl_mat_spec[3] = 0.8;
753
754 ogl_mat_emis[0] = 0.0;
755 ogl_mat_emis[1] = 0.0;
756 ogl_mat_emis[2] = 0.0;
757 ogl_mat_emis[3] = 0.0;
758
759 ogl_mat_shin = 25.0;
760
761 /* OGLXXX
762 * attenuation: see glLightf man page: (ignored for infinite lights)
763 * Add GL_LINEAR_ATTENUATION.
764 sgi_lmodel[0] = GL_CONSTANT_ATTENUATION;
765 sgi_lmodel[1] = 1.0;
766 sgi_lmodel[2] = 0.0;
767 sgi_lmodel[3] = ;
768 */
769
770 /* OGLXXX
771 * lmdef other possibilities include:
772 * glLightf(light, pname, *params);
773 * glLightModelf(pname, param);
774 * Check list numbering.
775 * Translate params as needed.
776 */
782
783 /* OGLXXX lmbind: check object numbering. */
784 /* OGLXXX
785 * lmbind: check object numbering.
786 * Use GL_FRONT in call to glMaterialf.
787 * Use GL_FRONT in call to glMaterialf.
788 if(1) {glCallList(1); glEnable(LMODEL);} else glDisable(LMODEL);
789 if(1) {glCallList(1); glEnable(GL_FRONT);} else glDisable(GL_FRONT);
790 */
791
792 return;
793}
794
795/*!
796 \brief Set material
797
798 \param set_shin,set_emis flags
799 \param sh,em should be 0. - 1.
800 \param emcolor packed colors to use for emission
801 */
802void gsd_set_material(int set_shin, int set_emis, float sh, float em,
803 int emcolor)
804{
805 if (set_shin) {
806 ogl_mat_spec[0] = sh;
807 ogl_mat_spec[1] = sh;
808 ogl_mat_spec[2] = sh;
809 ogl_mat_spec[3] = sh;
810
812
813 ogl_mat_shin = 60. + (int)(sh * 68.);
814
816 }
817
818 if (set_emis) {
819 ogl_mat_emis[0] = (em * (emcolor & 0x0000FF)) / 255.;
820 ogl_mat_emis[1] = (em * ((emcolor & 0x00FF00) >> 8)) / 255.;
821 ogl_mat_emis[2] = (em * ((emcolor & 0xFF0000) >> 16)) / 255.;
822
824 }
825
826 return;
827}
828
829/*!
830 \brief Define light
831
832 \param num light id (starts with 1)
833 \param vals position(x,y,z,w), color, ambientm, emission
834 */
835void gsd_deflight(int num, struct lightdefs *vals)
836{
837 if (num > 0 && num <= MAX_LIGHTS) {
838 ogl_light_pos[num - 1][0] = vals->position[X];
839 ogl_light_pos[num - 1][1] = vals->position[Y];
840 ogl_light_pos[num - 1][2] = vals->position[Z];
841 ogl_light_pos[num - 1][3] = vals->position[W];
842
843 glLightfv(GL_LIGHT0 + num, GL_POSITION, ogl_light_pos[num - 1]);
844
845 ogl_light_diff[num - 1][0] = vals->color[0];
846 ogl_light_diff[num - 1][1] = vals->color[1];
847 ogl_light_diff[num - 1][2] = vals->color[2];
848 ogl_light_diff[num - 1][3] = .3;
849
850 glLightfv(GL_LIGHT0 + num, GL_DIFFUSE, ogl_light_diff[num - 1]);
851
852 ogl_light_amb[num - 1][0] = vals->ambient[0];
853 ogl_light_amb[num - 1][1] = vals->ambient[1];
854 ogl_light_amb[num - 1][2] = vals->ambient[2];
855 ogl_light_amb[num - 1][3] = .3;
856
857 glLightfv(GL_LIGHT0 + num, GL_AMBIENT, ogl_light_amb[num - 1]);
858
859 ogl_light_spec[num - 1][0] = vals->color[0];
860 ogl_light_spec[num - 1][1] = vals->color[1];
861 ogl_light_spec[num - 1][2] = vals->color[2];
862 ogl_light_spec[num - 1][3] = .3;
863
864 glLightfv(GL_LIGHT0 + num, GL_SPECULAR, ogl_light_spec[num - 1]);
865 }
866
867 return;
868}
869
870/*!
871 \brief Switch light on/off
872
873 \param num
874 \param on 1 for 'on', 0 turns them off
875 */
876void gsd_switchlight(int num, int on)
877{
878 short defin;
879
880 defin = on ? num : 0;
881
882 if (defin) {
883 glEnable(GL_LIGHT0 + num);
884 }
885 else {
886 glDisable(GL_LIGHT0 + num);
887 }
888
889 return;
890}
891
892/*!
893 \brief Get image of current GL screen
894
895 \param pixbuf data buffer
896 \param[out] xsize,ysize picture dimension
897
898 \return 0 on failure
899 \return 1 on success
900 */
901int gsd_getimage(unsigned char **pixbuf, unsigned int *xsize,
902 unsigned int *ysize)
903{
904 GLuint l, r, b, t;
905
906 /* OGLXXX
907 * get GL_VIEWPORT:
908 * You can probably do better than this.
909 */
910 GLint tmp[4];
911
913 l = tmp[0];
914 r = tmp[0] + tmp[2] - 1;
915 b = tmp[1];
916 t = tmp[1] + tmp[3] - 1;
917
918 *xsize = r - l + 1;
919 *ysize = t - b + 1;
920
921 if (!*xsize || !*ysize)
922 return (0);
923
924 *pixbuf =
925 (unsigned char *)G_malloc((*xsize) * (*ysize) * 4); /* G_fatal_error */
926
927 if (!*pixbuf)
928 return (0);
929
930#if !defined(OPENGL_FBO)
932#endif
933
934 /* OGLXXX lrectread: see man page for glReadPixels */
935 glReadPixels(l, b, (r) - (l) + 1, (t) - (b) + 1, GL_RGBA, GL_UNSIGNED_BYTE,
936 *pixbuf);
937
938 return (1);
939}
940
941/*!
942 \brief Get viewpoint
943
944 \param tmp
945 \param num
946
947 \return 1
948 */
949int gsd_getViewport(GLint tmp[4], GLint num[2])
950{
951
952 /* Save current viewport to tmp */
955
956 return (1);
957}
958
959/*!
960 \brief Write view
961
962 \param pixbuf data buffer
963 \param xsize,ysize picture dimension
964
965 \return 0 on failure
966 \return 1 on success
967 */
968int gsd_writeView(unsigned char **pixbuf, unsigned int xsize,
969 unsigned int ysize)
970{
971
972 /* Malloc Buffer for image */
973 *pixbuf = (unsigned char *)G_malloc(xsize * ysize * 4); /* G_fatal_error */
974 if (!*pixbuf) {
975 return (0);
976 }
977
978#if !defined(OPENGL_FBO)
979 /* Read image buffer */
981#endif
982
983 /* Read Pixels into Buffer */
985 return (1);
986}
987
988/*!
989 \brief Specify pixel arithmetic
990
991 \param yesno turn on/off
992 */
994{
995 if (yesno) {
998 }
999 else {
1002 }
1003
1004 return;
1005}
1006
1007/*!
1008 \brief Define clip plane
1009
1010 \param num
1011 \param params
1012 */
1013void gsd_def_clipplane(int num, double *params)
1014{
1015 int wason = 0;
1016
1017 /* OGLXXX see man page for glClipPlane equation */
1018 if (glIsEnabled(GL_CLIP_PLANE0 + (num))) {
1019 wason = 1;
1020 }
1021
1022 glClipPlane(GL_CLIP_PLANE0 + (num), params);
1023
1024 if (wason) {
1025 glEnable(GL_CLIP_PLANE0 + (num));
1026 }
1027 else {
1028 glDisable(GL_CLIP_PLANE0 + (num));
1029 }
1030
1031 return;
1032}
1033
1034/*!
1035 \brief Set clip plane
1036
1037 \param num
1038 \param able
1039 */
1040void gsd_set_clipplane(int num, int able)
1041{
1042 /* OGLXXX see man page for glClipPlane equation */
1043 if (able) {
1044 glEnable(GL_CLIP_PLANE0 + (num));
1045 }
1046 else {
1047 glDisable(GL_CLIP_PLANE0 + (num));
1048 }
1049
1050 return;
1051}
1052
1053/*!
1054 \brief Finish
1055
1056 Does nothing, only called from src.contrib/GMSL/NVIZ2.2/src/glwrappers.c
1057 */
1058void gsd_finish(void)
1059{
1060 return;
1061}
1062
1063/*!
1064 \brief Set the viewport
1065
1066 <i>l</i>, <i>b</i> specify the lower left corner of the viewport
1067 rectangle, in pixels.
1068
1069 <i>r</i>, <i>t</i> specify the width and height of the viewport.
1070
1071 \param l left
1072 \param r right
1073 \param b bottom
1074 \param t top
1075 */
1076void gsd_viewport(int l, int r, int b, int t)
1077{
1078 /* Screencoord */
1079 glViewport(l, b, r, t);
1080
1081 return;
1082}
1083
1084/*!
1085 \brief ADD
1086
1087 First time called, gets a bunch of objects, then hands them back
1088 when needed
1089
1090 \return -1 on failure
1091 \return number of objects
1092 */
1094{
1095 int i;
1096
1097 if (numobjs) {
1098 if (numobjs < MAX_OBJS) {
1099 numobjs++;
1100
1101 return (numobjs);
1102 }
1103
1104 return (-1);
1105 }
1106 else {
1107 ObjList[0] = glGenLists(MAX_OBJS);
1108
1109 for (i = 1; i < MAX_OBJS; i++) {
1110 ObjList[i] = ObjList[0] + i;
1111 }
1112 numobjs = 1;
1113
1114 return (numobjs);
1115 }
1116}
1117
1118/*!
1119 \brief ADD
1120
1121 \param listno
1122 \param do_draw
1123 */
1125{
1126 if (do_draw) {
1128 }
1129 else {
1130 glNewList(ObjList[listno], GL_COMPILE);
1131 }
1132
1133 return;
1134}
1135
1136/*!
1137 \brief End list
1138 */
1139void gsd_endlist(void)
1140{
1141 glEndList();
1142
1143 return;
1144}
1145
1146/*!
1147 \brief Delete list
1148
1149 \param listno
1150 \param range [unused]
1151 */
1153{
1154 unsigned int i;
1155
1156 for (i = 1; i < MAX_OBJS; i++) {
1157 if (i == listno) {
1158 glDeleteLists(ObjList[i], 1);
1159 numobjs--;
1160 if (numobjs < 1)
1161 numobjs = 1;
1162 return;
1163 }
1164 }
1165}
1166
1167/*!
1168 \brief ADD
1169
1170 \param listno
1171 */
1173{
1174 glCallList(ObjList[listno]);
1175
1176 return;
1177}
1178
1179/*!
1180 \brief ADD
1181
1182 \param listno [unused]
1183 */
1185{
1186 int i;
1187
1189 for (i = 1; i < MAX_OBJS; i++) {
1190 glCallList(ObjList[i]);
1191 glFlush();
1192 }
1193 gsd_popmatrix();
1194
1196
1197 return;
1198}
void G_warning(const char *,...) __attribute__((format(printf
#define G_malloc(n)
Definition defs/gis.h:136
void G_message(const char *,...) __attribute__((format(printf
void gsd_do_scale(int)
Set current scale.
Definition gsd_views.c:356
void gsd_call_label(void)
Call display list and draw defined labels – called from gsd_prim (gsd_call_lists)
Definition gsd_label.c:115
#define G_UNUSED
A macro for an attribute, if attached to a variable, indicating that the variable is not used.
Definition gis.h:45
#define _(str)
Definition glocale.h:10
void gsd_set_clipplane(int num, int able)
Set clip plane.
Definition gsd_prim.c:1040
void gsd_endlist(void)
End list.
Definition gsd_prim.c:1139
void gsd_viewport(int l, int r, int b, int t)
Set the viewport.
Definition gsd_prim.c:1076
void gsd_endtstrip(void)
ADD.
Definition gsd_prim.c:326
void gsd_endtfan(void)
ADD.
Definition gsd_prim.c:346
void gsd_endtmesh(void)
ADD.
Definition gsd_prim.c:306
void gsd_swaptmesh(void)
ADD.
Definition gsd_prim.c:356
void gsd_backface(int n)
ADD.
Definition gsd_prim.c:253
void gsd_pushmatrix(void)
Push the current matrix stack.
Definition gsd_prim.c:510
int gsd_getViewport(GLint tmp[4], GLint num[2])
Get viewpoint.
Definition gsd_prim.c:949
void gsd_calllist(int listno)
ADD.
Definition gsd_prim.c:1172
void gsd_zwritemask(unsigned long n)
Write out z-mask.
Definition gsd_prim.c:240
void gsd_deflight(int num, struct lightdefs *vals)
Define light.
Definition gsd_prim.c:835
void gsd_vert_func(float *pt)
ADD.
Definition gsd_prim.c:685
void gsd_bgnqstrip(void)
ADD.
Definition gsd_prim.c:276
void gsd_switchlight(int num, int on)
Switch light on/off.
Definition gsd_prim.c:876
#define INT_TO_GRN(i, g)
Definition gsd_prim.c:53
void gsd_litvert_func(float *norm, unsigned long col, float *pt)
Set the current normal vector & specify vertex.
Definition gsd_prim.c:656
#define border
Definition gsd_prim.c:61
void gsd_colormode(int cm)
Set color mode.
Definition gsd_prim.c:97
void gsd_bgnpolygon(void)
Delimit the vertices of a primitive or a group of like primitives.
Definition gsd_prim.c:371
int gsd_writeView(unsigned char **pixbuf, unsigned int xsize, unsigned int ysize)
Write view.
Definition gsd_prim.c:968
void gsd_bgntstrip(void)
ADD.
Definition gsd_prim.c:316
void gsd_blend(int yesno)
Specify pixel arithmetic.
Definition gsd_prim.c:993
void gsd_init_lightmodel(void)
Initialize model light.
Definition gsd_prim.c:718
int gsd_getshademodel(void)
Get shaded model.
Definition gsd_prim.c:437
void gsd_bgnlist(int listno, int do_draw)
ADD.
Definition gsd_prim.c:1124
int gsd_makelist(void)
ADD.
Definition gsd_prim.c:1093
void gsd_swapbuffers(void)
Swap buffers.
Definition gsd_prim.c:481
void gsd_endqstrip(void)
ADD.
Definition gsd_prim.c:286
void gsd_sphere(float *center, float siz)
ADD.
Definition gsd_prim.c:206
void show_colormode(void)
Print color mode to stderr.
Definition gsd_prim.c:150
#define INT_TO_RED(i, r)
Definition gsd_prim.c:52
int gsd_getimage(unsigned char **pixbuf, unsigned int *xsize, unsigned int *ysize)
Get image of current GL screen.
Definition gsd_prim.c:901
#define INT_TO_BLU(i, b)
Definition gsd_prim.c:54
void gsd_backbuffer(void)
Draw to the back buffer.
Definition gsd_prim.c:469
#define MAX_OBJS
Definition gsd_prim.c:57
void gsd_popmatrix(void)
Pop the current matrix stack.
Definition gsd_prim.c:500
void gsd_flush(void)
Mostly for flushing drawing commands across a network.
Definition gsd_prim.c:83
void gsd_def_clipplane(int num, double *params)
Define clip plane.
Definition gsd_prim.c:1013
void gsd_endline(void)
End line.
Definition gsd_prim.c:406
void gsd_finish(void)
Finish.
Definition gsd_prim.c:1058
void gsd_calllists(int listno)
ADD.
Definition gsd_prim.c:1184
void gsd_circ(float x, float y, float rad)
ADD.
Definition gsd_prim.c:166
void gsd_bgntfan(void)
ADD.
Definition gsd_prim.c:336
void gsd_deletelist(GLuint listno, int range)
Delete list.
Definition gsd_prim.c:1152
int gsd_checkpoint(float pt[4], int window[4], int viewport[4], double modelMatrix[16], double projMatrix[16])
ADD.
Definition gsd_prim.c:584
void gsd_rot(float angle, char axis)
ADD.
Definition gsd_prim.c:604
void gsd_bgnline(void)
Begin line.
Definition gsd_prim.c:396
void gsd_scale(float xs, float ys, float zs)
Multiply the current matrix by a general scaling matrix.
Definition gsd_prim.c:524
void gsd_translate(float dx, float dy, float dz)
Multiply the current matrix by a translation matrix.
Definition gsd_prim.c:538
void gsd_bgntmesh(void)
ADD.
Definition gsd_prim.c:296
void gsd_disc(float x, float y, float z, float rad)
ADD.
Definition gsd_prim.c:186
void gsd_getwindow(int *window, int *viewport, double *modelMatrix, double *projMatrix)
Get viewport.
Definition gsd_prim.c:553
#define INT_TO_ALP(i, a)
Definition gsd_prim.c:55
void gsd_litvert_func2(float *norm, unsigned long col, float *pt)
ADD.
Definition gsd_prim.c:672
void gsd_color_func(unsigned int col)
Set current color.
Definition gsd_prim.c:697
void gsd_shademodel(int shade)
Set shaded model.
Definition gsd_prim.c:418
void gsd_bothbuffers(void)
Draw to the front and back buffers.
Definition gsd_prim.c:445
void gsd_frontbuffer(void)
Draw to the front buffer.
Definition gsd_prim.c:457
void gsd_endpolygon(void)
Delimit the vertices of a primitive or a group of like primitives.
Definition gsd_prim.c:386
void gsd_linewidth(short n)
Set width of rasterized lines.
Definition gsd_prim.c:266
void gsd_set_material(int set_shin, int set_emis, float sh, float em, int emcolor)
Set material.
Definition gsd_prim.c:802
float g
Definition named_colr.c:7
OGSF header file (structures)
#define CM_DIFFUSE
Definition ogsf.h:157
#define X
Definition ogsf.h:146
#define CM_AD
Definition ogsf.h:159
#define CM_EMISSION
Definition ogsf.h:155
#define CM_NULL
Definition ogsf.h:160
#define Z
Definition ogsf.h:148
#define W
Definition ogsf.h:149
#define MAX_LIGHTS
Definition ogsf.h:52
#define Y
Definition ogsf.h:147
#define CM_COLOR
Definition ogsf.h:154
double b
Definition r_raster.c:37
double l
Definition r_raster.c:37
double t
Definition r_raster.c:37
double r
Definition r_raster.c:37
float ambient[3]
R, G, B.
Definition ogsf.h:540
float position[4]
X, Y, Z, (1=local/0=inf)
Definition ogsf.h:534
float color[3]
R, G, B.
Definition ogsf.h:537
#define x