0f933b41364b7df9989c1d0933a357eae8b242da
[occt.git] / src / OpenGl / OpenGl_togl_redraw.cxx
1 /***********************************************************************
2
3 FONCTION :
4 ----------
5 file OpenGl_togl_redraw.c :
6
7
8 REMARQUES:
9 ----------
10
11
12 HISTORIQUE DES MODIFICATIONS   :
13 --------------------------------
14 xx-xx-xx : CAL ; Creation.
15 23-01-97 : CAL : Ajout pour mettre des traces facilement
16 apres lancement de Designer
17 05-02-97 : FMN ; Suppression de OpenGl_tgl_vis.h
18 03-03-97 : FMN ; (PRO4063) Ajout displaylist pour le mode transient
19 07-10-97 : FMN ; Simplification WNT
20 08-08-98 : FMN ; ajout PRINT debug
21 18-11-98 : CAL ; S4062. Ajout des layers.
22 15-11-99 : GG  ; Add call_togl_redraw_area()
23 15-11-99 : VKH ; G004 redrawing view to a large pixmap
24 02.01.100 : JR : = 0 for Integer and = NULL for pointers
25 02.02.100   "    #include <GL/glu.h> for declaration of gluErrorString
26 07-03-00 : GG : G004 use the already created pixmap.
27 Enable two side lighting before redrawing in pixmap.
28
29 ************************************************************************/
30
31 #define G004    /* VKH 15-11-99 redrawing view to a large pixmap
32 */
33
34 #define RIC120302 /*  GG Enable to use the application display
35 callback at end of traversal
36 Modified P. Dolbey 09/06/07 to call back
37 before redrawing the overlayer
38 */
39
40 /*----------------------------------------------------------------------*/
41 /*
42 * Includes
43 */
44
45 #ifdef G004
46 #ifndef WNT
47 #define CALL_DEF_STRING_LENGTH 132
48 #else
49 #include <OpenGl_AVIWriter.hxx>
50 #endif
51 # include <OpenGl_tgl_all.hxx>
52 GLboolean g_fBitmap;
53 #endif  /*G004*/
54
55 #include <OpenGl_tgl.hxx>
56 #include <OpenGl_tsm_ws.hxx>
57 #include <OpenGl_tgl_tox.hxx>
58 #include <OpenGl_txgl.hxx>
59 #include <OpenGl_tgl_funcs.hxx>
60 #include <OpenGl_tgl_subrvis.hxx>
61 #include <OpenGl_FrameBuffer.hxx>
62 #include <InterfaceGraphic_Graphic3d.hxx>
63 #include <InterfaceGraphic_Visual3d.hxx>
64
65 void EXPORT
66 call_togl_redraw
67 (
68  CALL_DEF_VIEW * aview,
69  CALL_DEF_LAYER * anunderlayer,
70  CALL_DEF_LAYER * anoverlayer
71  )
72 {
73   CMN_KEY_DATA data;
74   Tint swap = 1; /* swap buffers ? yes */
75
76   if ( TsmGetWSAttri (aview->WsId, WSWindow, &data) != TSuccess ) return;
77
78   WINDOW aWin = (WINDOW )data.ldata;
79   if (TxglWinset (call_thedisplay, aWin) == TSuccess)
80   {
81     OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer* )aview->ptrFBO;
82     GLint aViewPortBack[4]; glGetIntegerv (GL_VIEWPORT, aViewPortBack);
83     if (aFrameBuffer != NULL)
84     {
85       aFrameBuffer->SetupViewport();
86       aFrameBuffer->BindBuffer();
87       swap = 0; // no need to swap buffers
88     }
89
90     call_func_redraw_all_structs_begin (aview->WsId);
91     if (anunderlayer->ptrLayer)
92     {
93       call_togl_redraw_layer2d (aview, anunderlayer);
94     }
95     call_func_redraw_all_structs_proc (aview->WsId);
96     if (anoverlayer->ptrLayer)
97     {
98       call_togl_redraw_layer2d (aview, anoverlayer);
99     }
100     call_subr_displayCB (aview, OCC_REDRAW_WINDOW);
101     call_func_redraw_all_structs_end (aview->WsId, swap);
102     call_togl_redraw_immediat_mode (aview);
103
104     if (aFrameBuffer != NULL)
105     {
106       aFrameBuffer->UnbindBuffer();
107       // move back original viewport
108       glViewport (aViewPortBack[0], aViewPortBack[1], aViewPortBack[2], aViewPortBack[3]);
109     }
110   }
111
112 #ifdef WNT
113   if (OpenGl_AVIWriter_AllowWriting (aview->DefWindow.XWindow))
114   {
115     GLint params[4];
116     glGetIntegerv (GL_VIEWPORT, params);
117     int nWidth = params[2] & ~0x7;
118     int nHeight = params[3] & ~0x7;
119
120     const int nBitsPerPixel = 24;
121     GLubyte* aDumpData = new GLubyte[nWidth * nHeight * nBitsPerPixel / 8];
122
123     glPixelStorei (GL_PACK_ALIGNMENT, 1);
124     glReadPixels (0, 0, nWidth, nHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, aDumpData);
125     OpenGl_AVIWriter_AVIWriter (aDumpData, nWidth, nHeight, nBitsPerPixel);
126     delete[] aDumpData;
127   }
128 #endif
129
130   return;
131 }
132
133 void EXPORT
134 call_togl_redraw_area
135 (
136  CALL_DEF_VIEW * aview,
137  CALL_DEF_LAYER * anunderlayer,
138  CALL_DEF_LAYER * anoverlayer,
139  int x, int y, int width, int height
140  )
141 {
142   CMN_KEY_DATA data;
143
144   /*
145   When the exposure area size is > window size / 2 do a full redraw.
146   */
147   if( width*height >
148     (int)(aview->DefWindow.dx*aview->DefWindow.dy)/2 ) {
149       call_togl_redraw(aview,anunderlayer,anoverlayer);
150       return;
151     }
152     /*
153     Or redraw only the area in the front buffer
154     */
155     TsmGetWSAttri (aview->WsId, WSWindow, &data);
156     if (TxglWinset (call_thedisplay, (WINDOW) data.ldata) == TSuccess)
157     {
158       GLint buffer;
159       glGetIntegerv (GL_DRAW_BUFFER, &buffer);
160       if (buffer != GL_FRONT) glDrawBuffer (GL_FRONT);
161       glEnable (GL_SCISSOR_TEST);
162       glScissor ((GLint )x,
163                  (GLint )((int )aview->DefWindow.dy - (y + height)),
164                  (GLsizei )width, (GLsizei )height);
165       call_func_redraw_all_structs_begin (aview->WsId);
166       if (anunderlayer->ptrLayer)
167       {
168         call_togl_redraw_layer2d (aview, anunderlayer);
169       }
170       call_func_redraw_all_structs_proc (aview->WsId);
171       if (anoverlayer->ptrLayer)
172       {
173         call_togl_redraw_layer2d (aview, anoverlayer);
174       }
175       call_subr_displayCB(aview,OCC_REDRAW_WINDOWAREA);
176       call_func_redraw_all_structs_end (aview->WsId, 0);
177       call_togl_redraw_immediat_mode (aview);
178       glFlush();
179       glDisable (GL_SCISSOR_TEST);
180       if (buffer != GL_FRONT) glDrawBuffer (buffer);
181     }
182 }