OCC22199 OpenGL memory leaks in TKOpenGl
[occt.git] / src / OpenGl / OpenGl_mrkr.cxx
CommitLineData
7fd59977 1/***********************************************************************
2
3FONCTION :
4----------
5File OpenGl_mrkr :
6
7
8REMARQUES:
9----------
10
11
12HISTORIQUE DES MODIFICATIONS :
13--------------------------------
14xx-xx-xx : xxx ; Creation.
1511-03-96 : FMN ; Correction warning compilation
1601-04-96 : CAL ; Integration MINSK portage WNT
1708-07-96 : BGN ; (PRO4768) suppression du cas particulier TEL_PM_DOT.
1821-10-96 : FMN ; Suppression LMC_COLOR fait dans OpenGl_execstruct.c
1919-10-96 : CAL ; Restauration du cas particulier TEL_PM_DOT mais
20avec la correction sur la mise a jour du pointSize.
21
22************************************************************************/
23
24/*----------------------------------------------------------------------*/
25/*
26* Includes
27*/
28
29
30#include <OpenGl_tgl_all.hxx>
31
32#include <stddef.h>
33#include <stdio.h>
34#include <string.h>
35
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
46extern GLuint GetListIndex(int);
47
48
49static TStatus MarkerDisplay( TSM_ELEM_DATA, Tint, cmn_key* );
50static TStatus MarkerAdd( TSM_ELEM_DATA, Tint, cmn_key* );
51static TStatus MarkerDelete( TSM_ELEM_DATA, Tint, cmn_key* );
52static TStatus MarkerPrint( TSM_ELEM_DATA, Tint, cmn_key* );
53static TStatus MarkerInquire( TSM_ELEM_DATA, Tint, cmn_key* );
54
55/*static GLboolean lighting_mode;*/
56
57static TStatus (*MtdTbl[])( TSM_ELEM_DATA, Tint, cmn_key* ) =
58{
59 MarkerDisplay, /* PickTraverse */
60 MarkerDisplay,
61 MarkerAdd,
62 MarkerDelete,
63 MarkerPrint,
64 MarkerInquire
65};
66
67
68MtblPtr
69TelMarkerInitClass( TelType *el )
70{
71 *el = TelMarker;
72 return MtdTbl;
73}
74
75static TStatus
76MarkerAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k )
77{
78 tel_point data = new TEL_POINT;
79
80 if( !data )
81 return TFailure;
82
83 *data = *(tel_point)(k[0]->data.pdata);
84
85 ((tsm_elem_data)(d.pdata))->pdata = data;
86
87 return TSuccess;
88}
89
90extern GLuint markerBase;
91static TStatus
92MarkerDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k )
93{
94 tel_point p;
95 CMN_KEY key1, key2, key3;
96 TEL_COLOUR colour;
97 Tchar *str;
98
99 key1.id = TelPolymarkerColour;
100 key1.data.pdata = &colour;
101
102 key2.id = TelPolymarkerType;
103 key3.id = TelPolymarkerSize;
104
105 TsmGetAttri( 3, &key1, &key2, &key3 );
106
107 if( k[0]->id == TOn )
108 { /* Use highlight colours */
109 TEL_HIGHLIGHT hrep;
110
111 key1.id = TelHighlightIndex;
112 TsmGetAttri( 1, &key1 );
113 if( TelGetHighlightRep( TglActiveWs, key1.data.ldata, &hrep )
114 == TSuccess )
115 colour = hrep.col;
116 else
117 {
118 TelGetHighlightRep( TglActiveWs, 0, &hrep );
119 colour = hrep.col;
120 }
121 }
122
123 glColor3fv( colour.rgb );
124 p = (tel_point)data.pdata;
125 if( key2.data.ldata == TEL_PM_DOT )
126 {
127 glPointSize( key3.data.fdata );
128 glBegin( GL_POINTS );
129 glVertex3fv( p->xyz );
130 glEnd();
131 }
132 else
133 {
134 GLint mode;
135 glGetIntegerv( GL_RENDER_MODE, &mode );
136 if( key2.data.ldata == TEL_PM_USERDEFINED )
137 {
138 glRasterPos3f( (GLfloat)(p->xyz[0]),
139 (GLfloat)(p->xyz[1]),
140 (GLfloat)(p->xyz[2]) );
141 glCallList( GetListIndex( (int)key3.data.fdata ) );
142 }
143 else
144 {
145 str = TelGetStringForPM( key2.data.ldata, key3.data.fdata );
146 glRasterPos3f( (GLfloat)(p->xyz[0]), (GLfloat)(p->xyz[1]),
147 (GLfloat)(p->xyz[2]) );
148 glListBase(markerBase);
149 glCallLists(strlen( (char*)str ), GL_UNSIGNED_BYTE, (GLubyte *) str );
150 }
151
152 if( mode==GL_FEEDBACK )
153 {
154 glBegin( GL_POINTS );
155 glVertex3f( p->xyz[0], p->xyz[1], p->xyz[2] );
156 glEnd();
157 /* it is necessary to indicate end of marker information*/
158 }
159 }
160
161 return TSuccess;
162}
163
164
165static TStatus
166MarkerDelete( TSM_ELEM_DATA data, Tint n, cmn_key *k )
167{
168 if (data.pdata)
169 delete data.pdata;
170 return TSuccess;
171}
172
173
174
175
176static TStatus
177MarkerPrint( TSM_ELEM_DATA data, Tint n, cmn_key *k )
178{
179 tel_point p;
180
181 p = (tel_point)data.pdata;
182
183 fprintf( stdout, "TelMarker. Value = %g, %g, %g\n",
184 p->xyz[0], p->xyz[1], p->xyz[2] );
185 fprintf( stdout, "\n" );
186
187 return TSuccess;
188}
189
190
191static TStatus
192MarkerInquire( TSM_ELEM_DATA data, Tint n, cmn_key *k )
193{
194 Tint i;
195 tel_point d;
196 Tint size_reqd=0;
197 TStatus status = TSuccess;
198
199 d = (tel_point)data.pdata;
200
201 size_reqd = sizeof( TEL_POINT );
202
203 for( i = 0; i < n; i++ )
204 {
205 switch( k[i]->id )
206 {
207 case INQ_GET_SIZE_ID:
208 {
209 k[i]->data.ldata = size_reqd;
210 break;
211 }
212
213 case INQ_GET_CONTENT_ID:
214 {
215 TEL_INQ_CONTENT *c;
216 Teldata *w;
217
218 c = (tel_inq_content)k[i]->data.pdata;
219 c->act_size = size_reqd;
220 w = c->data;
221
222 if( c->size >= size_reqd )
223 {
224 w->pts3 = (tel_point)(c->buf);
225 *(w->pts3) = *d;
226 status = TSuccess;
227 }
228 else
229 status = TFailure;
230 break;
231 }
232 }
233 }
234 return status;
235}