OCC22108 Cutting plane unpredictable behaviour in V3d_View
[occt.git] / src / OpenGl / OpenGl_polyl.cxx
CommitLineData
7fd59977 1/***********************************************************************
2
3FONCTION :
4----------
5File OpenGl_polyl :
6
7
8REMARQUES:
9----------
10
11
12HISTORIQUE DES MODIFICATIONS :
13--------------------------------
14xx-xx-xx : xxx ; Creation.
1521-10-96 : FMN ; Suppression LMC_COLOR fait dans OpenGl_execstruct.c
16
17************************************************************************/
18
19#define G003 /* EUG 07-10-99 Degeneration mode support
20*/
21
22#define IMP190602 /* GG Avoid memory leaks after creating a polyline
23// with vertex colors primitive.
24// Thanks to Ivan Fontaine (SAMTECH) for this improvment
25*/
26
27/*----------------------------------------------------------------------*/
28/*
29* Includes
30*/
31
32#include <OpenGl_tgl_all.hxx>
33
34#include <stddef.h>
35#include <stdio.h>
36#include <GL/gl.h>
37#include <GL/glu.h>
38
39#include <OpenGl_cmn_varargs.hxx>
40#include <OpenGl_telem_attri.hxx>
41#include <OpenGl_telem_highlight.hxx>
42#include <OpenGl_tsm.hxx>
43#include <OpenGl_telem.hxx>
44#include <OpenGl_telem_inquire.hxx>
45#include <OpenGl_Memory.hxx>
46
47#ifdef G003
48extern int g_nDegenerateModel;
49#endif /* G003 */
50
51static TStatus PolylineDisplay( TSM_ELEM_DATA, Tint, cmn_key* );
52static TStatus PolylineAdd( TSM_ELEM_DATA, Tint, cmn_key* );
53static TStatus PolylineDelete( TSM_ELEM_DATA, Tint, cmn_key* );
54static TStatus PolylinePrint( TSM_ELEM_DATA, Tint, cmn_key* );
55static TStatus PolylineInquire( TSM_ELEM_DATA, Tint, cmn_key* );
56
57/*static GLboolean lighting_mode;*/
58
59static TStatus (*MtdTbl[])( TSM_ELEM_DATA, Tint, cmn_key* ) =
60{
61 PolylineDisplay,
62 PolylineDisplay,
63 PolylineAdd,
64 PolylineDelete,
65 PolylinePrint,
66 PolylineInquire
67};
68
69struct TEL_LINE_DATA
70{
71 Tint num_lines; /* Number of polylines */
72 Tint num_vertices; /* Number of vertices in vertices array */
73 Tint *bounds; /* Array of number of points in each polyline */
74 tel_colour vcolours; /* vertex colour values for each vertex */
75 tel_point vertices; /* vertices array of length num_vertices */
76 IMPLEMENT_MEMORY_OPERATORS
77};
78typedef TEL_LINE_DATA* tel_line_data;
79
80MtblPtr
81TelPolylineInitClass( TelType* el )
82{
83 *el = TelPolyline;
84 return MtdTbl;
85}
86
87static TStatus
88PolylineAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k )
89
90{
91 Tint i, j;
92 tel_line_data p;
93
94 for( i = 0; i < n; i++ )
95 {
96 if( k[i]->id == NUM_LINES_ID )
97 break;
98 }
99
100 if( i == n )
101 return TFailure;
102
103 if( !(k[i]->data.ldata) )
104 return TFailure;
105
106 for( j = 0; j < n; j++ )
107 {
108 if( k[j]->id == BOUNDS_DATA_ID )
109 break;
110 }
111
112 if( j == n )
113 return TFailure;
114
115 p = new TEL_LINE_DATA();
116 p->num_lines = k[i]->data.ldata;
117 p->bounds = new Tint[p->num_lines];
118 memcpy( p->bounds, k[j]->data.pdata, p->num_lines*sizeof(Tint) );
119
120 p->num_vertices = 0;
121 for( i = 0; i < p->num_lines; i++ )
122 {
123 p->num_vertices += p->bounds[i];
124 }
125
126 for( i = 0; i < n; i++ )
127 {
128 switch( k[i]->id )
129 {
130 case VERTEX_COLOUR_VALS_ID:
131 p->vcolours = new TEL_COLOUR[p->num_vertices];
132 memcpy( p->vcolours, k[i]->data.pdata, p->num_vertices*sizeof(TEL_COLOUR) );
133 break;
134
135 case VERTICES_ID:
136 p->vertices = new TEL_POINT[p->num_vertices];
137 memcpy( p->vertices, k[i]->data.pdata, p->num_vertices*sizeof(TEL_POINT) );
138 break;
139 }
140 }
141
142 ((tsm_elem_data)(d.pdata))->pdata = p;
143
144 return TSuccess;
145}
146
147
148static TStatus
149PolylineDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k )
150{
151 tel_line_data d;
152 Tint i, j, a;
153 CMN_KEY key;
154 TEL_COLOUR colour;
155
156 d = (tel_line_data)data.pdata;
157
158 /* OCC11904 -- Temporarily disable environment mapping */
159 glPushAttrib(GL_ENABLE_BIT);
160 glDisable(GL_TEXTURE_1D);
161 glDisable(GL_TEXTURE_2D);
162
163 if( k[0]->id == TOn )
164 { /* Use highlight colours */
165 TEL_HIGHLIGHT hrep;
166
167 key.id = TelHighlightIndex;
168 TsmGetAttri( 1, &key );
169 if( TelGetHighlightRep( TglActiveWs, key.data.ldata, &hrep )
170 == TSuccess )
171 colour = hrep.col;
172 else
173 {
174 TelGetHighlightRep( TglActiveWs, 0, &hrep );
175 colour = hrep.col;
176 }
177 }
178 else
179 {
180 key.id = TelPolylineColour;
181 key.data.pdata = &colour;
182 TsmGetAttri( 1, &key );
183 }
184
185 if( !d->vcolours )
186 {
187 glColor3fv( colour.rgb );
188 for( i = 0, j = 0, a = 0; i < d->num_lines; i++ )
189 {
190 a = j + d->bounds[i];
191#ifdef G003
192 glBegin ( g_nDegenerateModel != 3 ? GL_LINE_STRIP : GL_POINTS );
193#else
194 glBegin(GL_LINE_STRIP);
195#endif /* G003 */
196 for( ; j < a; j++ )
197 glVertex3fv( d->vertices[j].xyz );
198 glEnd();
199 }
200 }
201 else
202 {
203 for( i = 0, j = 0, a = 0; i < d->num_lines; i++ )
204 {
205 a = j + d->bounds[i];
206#ifdef G003
207 glBegin ( g_nDegenerateModel != 3 ? GL_LINE_STRIP : GL_POINTS );
208#else
209 glBegin(GL_LINE_STRIP);
210#endif /* G003 */
211 for( ; j < a; j++ )
212 {
213 glColor3fv( d->vcolours[j].rgb );
214 glVertex3fv( d->vertices[j].xyz );
215 }
216 glEnd();
217 }
218
219 }
220
221 glPopAttrib();
222 return TSuccess;
223}
224
225
226static TStatus
227PolylineDelete( TSM_ELEM_DATA data, Tint n, cmn_key *k )
228{
229 tel_line_data p = (tel_line_data)data.pdata;
230 if( p->bounds )
231 delete[] p->bounds;
232 if( p->vertices )
233 delete[] p->vertices;
234#ifdef IMP190602
235 if( p->vcolours )
236 delete[] p->vcolours;
237#endif
238 if (data.pdata)
239 delete data.pdata;
240
241 return TSuccess;
242}
243
244
245
246
247static TStatus
248PolylinePrint( TSM_ELEM_DATA data, Tint n, cmn_key *k )
249{
250 Tint i;
251 tel_line_data p = (tel_line_data)data.pdata;
252
253 fprintf( stdout, "TelPolyline. Number of Lines: %d\n", p->num_lines );
254
255 if( p->vcolours )
256 fprintf( stdout, "\t\tVertex Flag : COLOUR\n" );
257 else
258 fprintf( stdout, "\t\tVertex Flag : NONE\n" );
259
260 if( p->bounds )
261 {
262 fprintf( stdout, "\t\tLengths array :\n" );
263 for( i = 0; i < p->num_lines; i++ )
264 fprintf( stdout, "\t\tL[%d] %d \n", i, p->bounds[i] );
265 }
266
267 if( p->vertices )
268 {
269 fprintf( stdout, "\n\t\tVertices : " );
270 for( i = 0; i < p->num_vertices; i++ )
271 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
272 p->vertices[i].xyz[0],
273 p->vertices[i].xyz[1],
274 p->vertices[i].xyz[2] ); }
275
276 fprintf( stdout, "\n" );
277
278 if( p->vcolours )
279 {
280 fprintf( stdout, "\n\t\tVertex Colours : " );
281 for( i = 0; i < p->num_vertices; i++ )
282 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
283 p->vcolours[i].rgb[0],
284 p->vcolours[i].rgb[1],
285 p->vcolours[i].rgb[2] ); }
286 else
287 fprintf( stdout, "\n\t\tVertex Colours not specified\n" );
288
289 fprintf( stdout, "\n" );
290
291 return TSuccess;
292}
293
294static TStatus
295PolylineInquire( TSM_ELEM_DATA data, Tint n, cmn_key *k )
296{
297 Tint i;
298 tel_line_data d;
299 Tint size_reqd=0;
300 TStatus status = TSuccess;
301
302 d = (tel_line_data)data.pdata;
303
304 size_reqd = d->num_lines * sizeof( Tint );
305 size_reqd += ( d->num_vertices * sizeof( TEL_POINT ) );
306 if( d->vcolours )
307 {
308 size_reqd += ( d->num_vertices * sizeof( TEL_COLOUR ) );
309 }
310
311 for( i = 0; i < n; i++ )
312 {
313 switch( k[i]->id )
314 {
315 case INQ_GET_SIZE_ID:
316 {
317 k[i]->data.ldata = size_reqd;
318 break;
319 }
320
321 case INQ_GET_CONTENT_ID:
322 {
323 TEL_INQ_CONTENT *c;
324 Teldata *w;
325
326 c = (tel_inq_content)k[i]->data.pdata;
327 c->act_size = size_reqd;
328 w = c->data;
329 w->lineset3data.num_bounds = d->num_lines;
330
331 if( d->vcolours )
332 w->lineset3data.vrtflag = TEL_VTFLAG_COLOUR;
333 else
334 w->lineset3data.vrtflag = TEL_VTFLAG_NONE;
335
336 if( c->size >= size_reqd )
337 {
338 w->lineset3data.bounds = (Tint *)(c->buf);
339 memcpy( w->lineset3data.bounds, d->bounds, d->num_lines*sizeof(Tint) );
340
341 w->lineset3data.points =
342 (tel_point)(c->buf + d->num_lines * sizeof( Tint ) );
343
344 memcpy( w->lineset3data.points, d->vertices, d->num_vertices*sizeof(TEL_POINT) );
345 if( d->vcolours )
346 {
347 w->lineset3data.colours = (tel_colour)( c->buf +
348 d->num_lines * sizeof( Tint ) +
349 d->num_vertices * sizeof( TEL_POINT ));
350 memcpy( w->lineset3data.colours, d->vcolours, d->num_vertices*sizeof(TEL_COLOUR) );
351 }
352 else
353 w->lineset3data.colours = 0;
354
355 status = TSuccess;
356 }
357 else
358 status = TFailure;
359 break;
360 }
361 }
362 }
363 return status;
364}