0022149: Strings with Japanese characters can not be displayed in 3D viewer
[occt.git] / src / OpenGl / OpenGl_togl_texture.cxx
CommitLineData
7fd59977 1/***********************************************************************
2
3FONCTION :
4----------
5File OpenGl_togl_texture.c :
6
7
8REMARQUES:
9----------
10
11
12HISTORIQUE DES MODIFICATIONS :
13--------------------------------
1405-08-97 : PCT ; Support texture mapping
1520-11-97 : FMN ; Ajout call_togl_inquiretexture
16Ajout coupure du texture mapping
17
18************************************************************************/
19
20#define OCC1188 /*SAV 23/12/02 - added methods to set background image */
21
22/*----------------------------------------------------------------------*/
23/*
24* Includes
25*/
26#include <stdlib.h>
27#include <string.h>
28#include <OpenGl_tgl_all.hxx>
29#include <InterfaceGraphic_Labels.hxx>
30#include <InterfaceGraphic_Graphic3d.hxx>
31#include <InterfaceGraphic_Visual3d.hxx>
32#include <OpenGl_tgl_funcs.hxx>
33#include <OpenGl_TextureBox.hxx>
34
35#include <OpenGl_cmn_varargs.hxx>
36#include <OpenGl_tsm.hxx>
37#include <OpenGl_tsm_ws.hxx>
38
39#ifdef OCC1188
40#include <GL/glu.h>
41#endif
42
43/*----------------------------------------------------------------------*/
44
45int EXPORT
46call_togl_create_texture
47(
48 int Type,
49 unsigned int Width,
50 unsigned int Height,
51 unsigned char *Data,
52 char *FileName
53 )
54{
55 if (call_togl_inquiretexture ())
56 {
57 switch (Type)
58 {
59 case 0:
60 return GetTextureData1D(FileName, Width, Height, Data);
61
62 case 1:
63 return GetTextureData2D(FileName, Width, Height, Data);
64
65 case 2:
66 return GetTextureData2DMipMap(FileName, Width, Height, Data);
67
68 default:
69 return -1;
70 }
71 }
72 return -1 ;
73}
74
75/*----------------------------------------------------------------------*/
76
77void EXPORT
78call_togl_destroy_texture
79(
80 int TexId
81 )
82{
83 if (call_togl_inquiretexture ())
84 FreeTexture(TexId);
85}
86
87/*----------------------------------------------------------------------*/
88
89void EXPORT
90call_togl_modify_texture
91(
92 int TexId,
93 CALL_DEF_INIT_TEXTURE *init_tex
94 )
95{
96 if (call_togl_inquiretexture ())
97 {
98 if (init_tex->doModulate)
99 SetTextureModulate(TexId);
100 else
101 SetTextureDecal(TexId);
102
103 if (init_tex->doRepeat)
104 SetTextureRepeat(TexId);
105 else
106 SetTextureClamp(TexId);
107
108 switch (init_tex->Mode)
109 {
110 case 0:
111 SetModeObject(TexId,
112 &init_tex->sparams[0], &init_tex->tparams[0]);
113 break;
114
115 case 1:
116 SetModeSphere(TexId);
117 break;
118
119 case 2:
120 SetModeEye(TexId,
121 &init_tex->sparams[0], &init_tex->tparams[0]);
122 break;
123
124 case 3:
125 SetModeManual(TexId);
126 break;
127 }
128
129 if (init_tex->doLinear)
130 SetRenderLinear(TexId);
131 else
132 SetRenderNearest(TexId);
133
134 SetTexturePosition(TexId,
135 init_tex->sx, init_tex->sy,
136 init_tex->tx, init_tex->ty,
137 init_tex->angle);
138 }
139}
140
141/*----------------------------------------------------------------------*/
142
143void EXPORT
144call_togl_environment(CALL_DEF_VIEW *aview)
145{
146 CMN_KEY_DATA data;
147
148 if (call_togl_inquiretexture ())
149 {
150 data.ldata = aview->Context.TexEnvId;
151 TsmSetWSAttri(aview->WsId, WSTextureEnv, &data);
152
153 data.ldata = aview->Context.SurfaceDetail;
154 TsmSetWSAttri(aview->WsId, WSSurfaceDetail, &data);
155 }
156}
157
158/*----------------------------------------------------------------------*/
159
160int EXPORT
161call_togl_inquiretexture ()
162{
163#if defined(__sun)
164 return 1;
165#else
166 return 1;
167#endif /* SUN */
168}
169
170/*----------------------------------------------------------------------*/
171
172#ifdef OCC1188
173void EXPORT call_togl_create_bg_texture( CALL_DEF_VIEW* view, int width, int height,
174 unsigned char* data, int style )
175{
176 TSM_BG_TEXTURE tex;
177 tsm_bg_texture createdTex;
178 CMN_KEY_DATA cmnData;
179 CMN_KEY_DATA cmnKey;
180 GLuint texture = 0;
181 GLubyte *image = (GLubyte *)malloc(width * height * 3 * sizeof(GLubyte));
182 memcpy( image, data, ( width * height * 3 ) );
183
184 /* check if some bg texture is already created */
185 TsmGetWSAttri( view->WsId, WSBgTexture, &cmnData );
186 createdTex = (tsm_bg_texture)cmnData.pdata;
187 if ( createdTex->texId != 0 )
188 glDeleteTextures( 1, (GLuint*)&(createdTex->texId) );
189 glGenTextures( 1, &texture );
190 glBindTexture( GL_TEXTURE_2D, texture );
191 /* Create MipMapped Texture */
192 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
193 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
194 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
195 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
196 gluBuild2DMipmaps( GL_TEXTURE_2D, 3/*4*/, width, height, GL_RGB, GL_UNSIGNED_BYTE, image );
197
198 tex.texId = texture;
199 tex.width = width;
200 tex.height = height;
201 switch ( style ) {
202 case 0 :
203 case 1 :
204 tex.style = TSM_FS_CENTER;
205 break;
206 case 2 :
207 tex.style = TSM_FS_TILE;
208 break;
209 case 3 :
210 tex.style = TSM_FS_STRETCH;
211 break;
212 default :
213 tex.style = TSM_FS_CENTER;
214 break;
215 }
216
217 /* setting flag to update changes */
218 cmnKey.ldata = TNotDone;
219 TsmSetWSAttri( view->WsId, WSUpdateState, &cmnKey );
220
221 /* storing background texture */
222 cmnData.pdata = &tex;
223 TsmSetWSAttri( view->WsId, WSBgTexture, &cmnData );
224 free( image );
225}
226
227/*----------------------------------------------------------------------*/
228
229void EXPORT call_togl_set_bg_texture_style( CALL_DEF_VIEW* view, int style )
230{
231 tsm_bg_texture texture;
232 CMN_KEY_DATA cmnData;
233 CMN_KEY_DATA cmnKey;
234
235 /* check if background texture is already created */
236 TsmGetWSAttri( view->WsId, WSBgTexture, &cmnData );
237 texture = (tsm_bg_texture)cmnData.pdata;
238 if ( texture->texId != 0 ) {
239 switch ( style ) {
240 case 0 :
241 case 1 :
242 texture->style = TSM_FS_CENTER;
243 break;
244 case 2 :
245 texture->style = TSM_FS_TILE;
246 break;
247 case 3 :
248 texture->style = TSM_FS_STRETCH;
249 break;
250 default :
251 texture->style = TSM_FS_CENTER;
252 break;
253 }
254
255 /* setting flag to update changes */
256 cmnKey.ldata = TNotDone;
257 TsmSetWSAttri( view->WsId, WSUpdateState, &cmnKey );
258
259 /* storing background texture */
260 cmnData.pdata = texture;
261 TsmSetWSAttri( view->WsId, WSBgTexture, &cmnData );
262 }
263}
264#endif /* OCC1188 */
265/*----------------------------------------------------------------------*/