1 /***********************************************************************
5 file OpenGl_togl_redraw.c :
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.
29 ************************************************************************/
31 #define G004 /* VKH 15-11-99 redrawing view to a large pixmap
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
40 /*----------------------------------------------------------------------*/
47 #define CALL_DEF_STRING_LENGTH 132
49 #include <OpenGl_AVIWriter.hxx>
51 # include <OpenGl_tgl_all.hxx>
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 <OpenGl_ResourceCleaner.hxx>
63 #include <InterfaceGraphic_Graphic3d.hxx>
64 #include <InterfaceGraphic_Visual3d.hxx>
69 CALL_DEF_VIEW * aview,
70 CALL_DEF_LAYER * anunderlayer,
71 CALL_DEF_LAYER * anoverlayer
75 Tint swap = 1; /* swap buffers ? yes */
77 if ( TsmGetWSAttri (aview->WsId, WSWindow, &data) != TSuccess ) return;
79 WINDOW aWin = (WINDOW )data.ldata;
80 if (TxglWinset (call_thedisplay, aWin) == TSuccess)
82 OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer* )aview->ptrFBO;
83 GLint aViewPortBack[4]; glGetIntegerv (GL_VIEWPORT, aViewPortBack);
84 if (aFrameBuffer != NULL)
86 aFrameBuffer->SetupViewport();
87 aFrameBuffer->BindBuffer();
88 swap = 0; // no need to swap buffers
90 OpenGl_ResourceCleaner::GetInstance()->Cleanup();
91 call_func_redraw_all_structs_begin (aview->WsId);
92 call_togl_setplane( aview );
93 if (anunderlayer->ptrLayer)
95 call_togl_redraw_layer2d (aview, anunderlayer);
97 call_func_redraw_all_structs_proc (aview->WsId);
98 call_subr_displayCB (aview, OCC_REDRAW_WINDOW | OCC_PRE_OVERLAY);
99 if (anoverlayer->ptrLayer)
101 call_togl_redraw_layer2d (aview, anoverlayer);
103 call_subr_displayCB (aview, OCC_REDRAW_WINDOW);
104 call_func_redraw_all_structs_end (aview->WsId, swap);
105 call_togl_redraw_immediat_mode (aview);
107 if (aFrameBuffer != NULL)
109 aFrameBuffer->UnbindBuffer();
110 // move back original viewport
111 glViewport (aViewPortBack[0], aViewPortBack[1], aViewPortBack[2], aViewPortBack[3]);
116 if (OpenGl_AVIWriter_AllowWriting (aview->DefWindow.XWindow))
119 glGetIntegerv (GL_VIEWPORT, params);
120 int nWidth = params[2] & ~0x7;
121 int nHeight = params[3] & ~0x7;
123 const int nBitsPerPixel = 24;
124 GLubyte* aDumpData = new GLubyte[nWidth * nHeight * nBitsPerPixel / 8];
126 glPixelStorei (GL_PACK_ALIGNMENT, 1);
127 glReadPixels (0, 0, nWidth, nHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, aDumpData);
128 OpenGl_AVIWriter_AVIWriter (aDumpData, nWidth, nHeight, nBitsPerPixel);
137 call_togl_redraw_area
139 CALL_DEF_VIEW * aview,
140 CALL_DEF_LAYER * anunderlayer,
141 CALL_DEF_LAYER * anoverlayer,
142 int x, int y, int width, int height
148 When the exposure area size is > window size / 2 do a full redraw.
151 (int)(aview->DefWindow.dx*aview->DefWindow.dy)/2 ) {
152 call_togl_redraw(aview,anunderlayer,anoverlayer);
156 Or redraw only the area in the front buffer
158 TsmGetWSAttri (aview->WsId, WSWindow, &data);
159 if (TxglWinset (call_thedisplay, (WINDOW) data.ldata) == TSuccess)
162 glGetIntegerv (GL_DRAW_BUFFER, &buffer);
163 if (buffer != GL_FRONT) glDrawBuffer (GL_FRONT);
164 glEnable (GL_SCISSOR_TEST);
165 glScissor ((GLint )x,
166 (GLint )((int )aview->DefWindow.dy - (y + height)),
167 (GLsizei )width, (GLsizei )height);
168 OpenGl_ResourceCleaner::GetInstance()->Cleanup();
169 call_func_redraw_all_structs_begin (aview->WsId);
170 call_togl_setplane( aview );
171 if (anunderlayer->ptrLayer)
173 call_togl_redraw_layer2d (aview, anunderlayer);
175 call_func_redraw_all_structs_proc (aview->WsId);
176 call_subr_displayCB (aview, OCC_REDRAW_WINDOWAREA | OCC_PRE_OVERLAY);
177 if (anoverlayer->ptrLayer)
179 call_togl_redraw_layer2d (aview, anoverlayer);
181 call_subr_displayCB(aview,OCC_REDRAW_WINDOWAREA);
182 call_func_redraw_all_structs_end (aview->WsId, 0);
183 call_togl_redraw_immediat_mode (aview);
185 glDisable (GL_SCISSOR_TEST);
186 if (buffer != GL_FRONT) glDrawBuffer (buffer);