0012121: Optimization of existing selection classes
[occt.git] / src / OpenGl / OpenGl_telem_util.hxx
CommitLineData
7fd59977 1/***********************************************************************
2
3FONCTION :
4----------
5File Include OpenGl_telem_util :
6
7
8REMARQUES:
9----------
10
11
12HISTORIQUE DES MODIFICATIONS :
13--------------------------------
14xx-xx-xx : xxx ; Creation.
1522-04-96 : FMN ; Ajout TelReadImage TelDrawImage
1623-12-96 : CAL ; Probleme dans la macro vecmag
1712-02-97 : FMN ; Suppression TelEnquireFacilities()
1807-10-97 : FMN ; Simplification WNT
1923-12-97 : FMN ; Suppression TelBackInteriorStyle, TelBackInteriorStyleIndex
20
21************************************************************************/
22
23#ifndef OPENGL_TELEM_UTIL_H
24#define OPENGL_TELEM_UTIL_H
25
26#ifndef IMP190100
27#define IMP190100 /*GG To avoid too many REDRAW in immediat mode,
28// Add TelMakeFrontAndBackBufCurrent() function
29*/
30#endif
31
32#define BUC60823 /* GG 05/03/01 Avoid to crash in normal computation
33// between confused points
34*/
35
36#include <math.h>
37#include <GL/gl.h>
38#ifndef WNT
39#include <GL/glx.h>
40#endif
41#include <OpenGl_telem.hxx>
42
43/*
44* ShortRealLast () = 3.40282346638528860e+38
45* ShortRealFirst () = 3.40282346638528860e+38
46*/
47#define shortreallast() (3.e+38)
48#define shortrealfirst() (-3.e+38)
49
50/* vector manipulation macros */
51#define square(a) ((a)*(a))
52
53/* add */
54#define vecadd(a,b,c) { (a)[0]=(b)[0]+(c)[0]; \
55 (a)[1]=(b)[1]+(c)[1]; \
56 (a)[2]=(b)[2]+(c)[2]; }
57
58/* subtract */
59#define vecsub(a,b,c) { (a)[0]=(b)[0]-(c)[0]; \
60 (a)[1]=(b)[1]-(c)[1]; \
61 (a)[2]=(b)[2]-(c)[2]; }
62
63/* dot product */
64#define vecdot(a,b) ((a)[0]*(b)[0]+(a)[1]*(b)[1]+(a)[2]*(b)[2])
65
66/* cross product */
67#define veccrs(a,b,c) { Tfloat x, y, z; \
68 x = (b)[1]*(c)[2] - (b)[2]*(c)[1]; \
69 y = (b)[2]*(c)[0] - (b)[0]*(c)[2]; \
70 z = (b)[0]*(c)[1] - (b)[1]*(c)[0]; \
71 (a)[0] = x; \
72 (a)[1] = y; \
73 (a)[2] = z; }
74/* scale */
75#define vecscl(a,b) { (b)[0] *= (a); (b)[1] *= (a); (b)[2] *= (a); }
76
77/* magnitude square */
78#define vecmg2(a) (square((a)[0])+square((a)[1])+square((a)[2]))
79
80/* magnitude */
81#define vecmag(a) (sqrt((double)vecmg2(a)))
82
83/* normalize */
84#ifdef BUC60823
85#define vecnrmd(a,d) ( d = (Tfloat)vecmag(a), \
86 ( d > 1e-10 ? (a[0] /= d, a[1] /= d, a[2] /= d, d) : (Tfloat)0. ) )
87#define vecnrm(a) { Tfloat d; vecnrmd(a,d); }
88#else
89#define vecnrm(a) { Tfloat d; d = ( Tfloat )vecmag(a); \
90 (a)[0] /= d; (a)[1] /= d; (a)[2] /= d; }
91#endif
92
93/* angle between two vectors */
94#define vecang(a,b,d) { d = (Tfloat)(vecmag(a)*vecmag(b)); \
95 d = vecdot(a,b)/d; \
96 d = d < -1.0F ? -1.0F : d > 1.0F ? 1.0F : d; \
97 d = ( Tfloat )acos(d); }
98
99/* point along a vector at a distance */
100#define vecgnd(a,b,c,d) { Tfloat w; w = d/vecmag(c); \
101 (a)[0] = (b)[0]+(c)[0]*w; \
102 (a)[1] = (b)[1]+(c)[1]*w; \
103 (a)[2] = (b)[2]+(c)[2]*w; }
104/* copy */
105#define veccpy(a,b) ((a)[0]=(b)[0],(a)[1]=(b)[1],(a)[2]=(b)[2])
106
107/* end vector macros */
108
109typedef struct
110{
111 Tmatrix3 mat;
112}
113Tmatrix3Struct;
114
115#define matcpy(d,s) { *((Tmatrix3Struct*)(d)) = *((Tmatrix3Struct*)(s)); }
116/*
117(d)[0][0]=(s)[0][0],(d)[0][1]=(s)[0][1],(d)[0][2]=(s)[0][2],(d)[0][3]=(s)[0][3],
118(d)[1][0]=(s)[1][0],(d)[1][1]=(s)[1][1],(d)[1][2]=(s)[1][2],(d)[1][3]=(s)[1][3],
119(d)[2][0]=(s)[2][0],(d)[2][1]=(s)[2][1],(d)[2][2]=(s)[2][2],(d)[2][3]=(s)[2][3],
120(d)[3][0]=(s)[3][0],(d)[3][1]=(s)[3][1],(d)[3][2]=(s)[3][2],(d)[3][3]=(s)[3][3]
121*/
122
123#define matdump(m) { \
124 int i, j; \
125 for (i=0; i<4; i++) {\
126 printf ("\t"); \
127 for (j=0; j<4; j++) \
128 printf ("%f ", m[i][j]); \
129 printf ("\n"); \
130 } \
131}
132
133extern Tint TelRemdupnames( Tint*, Tint ); /* list, num */
134#ifdef BUC60823
135extern int TelGetPolygonNormal( tel_point, Tint*, Tint, Tfloat* );
136extern int TelGetNormal( Tfloat*, Tfloat*, Tfloat*, Tfloat* );
137#else
138extern void TelGetNormal( Tfloat*, Tfloat*, Tfloat*, Tfloat* );
139#endif
140/* point1, point2, point3, normal */
141extern Tint TelIsBackFace( Tmatrix3, Tfloat* ); /* normal */
142extern Tint TelIsBackFacePerspective( Tmatrix3, Tfloat*, Tfloat*, Tfloat* );
143/* matrix, point 1, point 2, point 3 */
144extern void TelMultiplymat3( Tmatrix3, Tmatrix3, Tmatrix3 );
145/* mat out, mat in, mat in */
146extern void TelTransposemat3( Tmatrix3 ); /* mat in out */
147extern void TelTranpt3( Tfloat [4], Tfloat [4], Tmatrix3 ); /* out, in, mat */
148
149extern void TelInitWS( Tint, Tint, Tint, Tfloat, Tfloat, Tfloat );
150/* ws, width, height, bgcolr, bgcolg, bgcolb */
151extern void TelSwapBuffers( Tint );
152extern void TelCopyBuffers( Tint, GLenum, GLenum,
153 Tfloat, Tfloat, Tfloat, Tfloat, Tfloat, Tfloat, Tint );
154extern TStatus TelProjectionRaster( Tint ws, Tfloat x, Tfloat y, Tfloat z,
155 Tfloat *xr, Tfloat *yr);
156extern TStatus TelUnProjectionRaster( Tint ws, Tint xr, Tint yr,
157 Tfloat *x, Tfloat *y, Tfloat *z);
158TStatus
159TelUnProjectionRasterWithRay(Tint ws, Tint xr, Tint yr, Tfloat *x, Tfloat *y, Tfloat *z,
160 Tfloat *dx, Tfloat *dy, Tfloat *dz);
161extern Tint TelBackBufferRestored(void);
162extern void TelSetBackBufferRestored( Tint );
163extern void TelEnable( Tint );
164extern void TelDisable( Tint );
165extern void TelFlush( Tint );
166
167extern void TelSetFrontFaceAttri(
168 Tint, /* interior_style */
169 Tint, /* back_interior_style */
170 Tint, /* interior_index */
171 Tint, /* back_interior_index */
172 Tint, /* front_shading_method */
173 Tint, /* back_shading_method */
174 Tint, /* front_lighting_model */
175 Tint, /* back_lighting_model */
176 tel_surf_prop, /* surf_prop */
177 tel_surf_prop, /* back_surf_prop */
178 tel_colour, /* interior_colour */
179 tel_colour /* back_interior_colour */
180 );
181extern void TelSetBackFaceAttri(
182 Tint, /* interior_style */
183 Tint, /* back_interior_style */
184 Tint, /* interior_index */
185 Tint, /* back_interior_index */
186 Tint, /* front_shading_method */
187 Tint, /* back_shading_method */
188 Tint, /* front_lighting_model */
189 Tint, /* back_lighting_model */
190 tel_surf_prop, /* surf_prop */
191 tel_surf_prop, /* back_surf_prop */
192 tel_colour, /* interior_colour */
193 tel_colour /* back_interior_colour */
194 );
195
196extern void TelReadImage(Tint , GLenum , Tint , Tint , Tint , Tint , unsigned int *);
197extern void TelDrawImage(Tint , GLenum , Tint , Tint , Tint , Tint , unsigned int *);
198extern void TelReadDepths(Tint , Tint , Tint , Tint , Tint , float *);
199
200extern void TelMakeFrontBufCurrent(Tint );
201extern void TelMakeBackBufCurrent(Tint );
202#ifdef IMP190100
203extern void TelMakeFrontAndBackBufCurrent(Tint );
204#endif
205
206#ifndef WNT
207extern void TelSetPixmapDBParams(Display *dpy,
208 Window window,
209 int width, int height, int depth, GC gc,
210 Pixmap pixmap,
211 GLXPixmap glxpixmap,
212 GLXContext ctx);
213extern GLXPixmap TelGetGLXPixmap(void);
214extern void TelSetPixmapDB(int flag);
215extern int TelTestPixmapDB(void);
216extern void TelDrawBuffer(GLenum buf);
217#endif /* WNT*/
218
219#endif