summaryrefslogtreecommitdiff
path: root/src/OpenGl/OpenGl_togl_redraw.cxx
blob: 8cc25a4b51bff1b3956527ac6d75af1dff0c9a42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/***********************************************************************

FONCTION :
----------
file OpenGl_togl_redraw.c :


REMARQUES:
----------


HISTORIQUE DES MODIFICATIONS   :
--------------------------------
xx-xx-xx : CAL ; Creation.
23-01-97 : CAL : Ajout pour mettre des traces facilement
apres lancement de Designer
05-02-97 : FMN ; Suppression de OpenGl_tgl_vis.h
03-03-97 : FMN ; (PRO4063) Ajout displaylist pour le mode transient
07-10-97 : FMN ; Simplification WNT
08-08-98 : FMN ; ajout PRINT debug
18-11-98 : CAL ; S4062. Ajout des layers.
15-11-99 : GG  ; Add call_togl_redraw_area()
15-11-99 : VKH ; G004 redrawing view to a large pixmap
02.01.100 : JR : = 0 for Integer and = NULL for pointers
02.02.100   "    #include <GL/glu.h> for declaration of gluErrorString
07-03-00 : GG : G004 use the already created pixmap.
Enable two side lighting before redrawing in pixmap.

************************************************************************/

#define G004    /* VKH 15-11-99 redrawing view to a large pixmap
*/

#define RIC120302 /*  GG Enable to use the application display
callback at end of traversal
Modified P. Dolbey 09/06/07 to call back
before redrawing the overlayer
*/

/*----------------------------------------------------------------------*/
/*
* Includes
*/

#ifdef G004
#ifndef WNT
#define CALL_DEF_STRING_LENGTH 132
#else
#include <OpenGl_AVIWriter.hxx>
#endif
# include <OpenGl_tgl_all.hxx>
GLboolean g_fBitmap;
#endif  /*G004*/

#include <OpenGl_tgl.hxx>
#include <OpenGl_tsm_ws.hxx>
#include <OpenGl_tgl_tox.hxx>
#include <OpenGl_txgl.hxx>
#include <OpenGl_tgl_funcs.hxx>
#include <OpenGl_tgl_subrvis.hxx>
#include <OpenGl_FrameBuffer.hxx>
#include <OpenGl_ResourceCleaner.hxx>
#include <InterfaceGraphic_Graphic3d.hxx>
#include <InterfaceGraphic_Visual3d.hxx>

#if defined(__MINGW32__)
# include <GL/glext.h>
#endif

void EXPORT
call_togl_redraw
(
 CALL_DEF_VIEW * aview,
 CALL_DEF_LAYER * anunderlayer,
 CALL_DEF_LAYER * anoverlayer
 )
{
  CMN_KEY_DATA data;
  Tint swap = 1; /* swap buffers ? yes */

  if ( TsmGetWSAttri (aview->WsId, WSWindow, &data) != TSuccess ) return;

  WINDOW aWin = (WINDOW )data.ldata;
  if (TxglWinset (call_thedisplay, aWin) == TSuccess)
  {
    OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer* )aview->ptrFBO;
    GLint aViewPortBack[4]; glGetIntegerv (GL_VIEWPORT, aViewPortBack);
    if (aFrameBuffer != NULL)
    {
      aFrameBuffer->SetupViewport();
      aFrameBuffer->BindBuffer();
      swap = 0; // no need to swap buffers
    }
    OpenGl_ResourceCleaner::GetInstance()->Cleanup();
    call_func_redraw_all_structs_begin (aview->WsId);
    call_subr_displayCB (aview, OCC_REDRAW_WINDOW | OCC_PRE_REDRAW);
    call_togl_setplane( aview );
    if (anunderlayer->ptrLayer)
    {
      call_togl_redraw_layer2d (aview, anunderlayer);
    }
    call_func_redraw_all_structs_proc (aview->WsId);
    call_subr_displayCB (aview, OCC_REDRAW_WINDOW | OCC_PRE_OVERLAY);
    if (anoverlayer->ptrLayer)
    {
      call_togl_redraw_layer2d (aview, anoverlayer);
    }
    call_subr_displayCB (aview, OCC_REDRAW_WINDOW);
    call_func_redraw_all_structs_end (aview->WsId, swap);
    call_togl_redraw_immediat_mode (aview);

    if (aFrameBuffer != NULL)
    {
      aFrameBuffer->UnbindBuffer();
      // move back original viewport
      glViewport (aViewPortBack[0], aViewPortBack[1], aViewPortBack[2], aViewPortBack[3]);
    }
  }

#ifdef WNT
  if (OpenGl_AVIWriter_AllowWriting (aview->DefWindow.XWindow))
  {
    GLint params[4];
    glGetIntegerv (GL_VIEWPORT, params);
    int nWidth = params[2] & ~0x7;
    int nHeight = params[3] & ~0x7;

    const int nBitsPerPixel = 24;
    GLubyte* aDumpData = new GLubyte[nWidth * nHeight * nBitsPerPixel / 8];

    glPixelStorei (GL_PACK_ALIGNMENT, 1);
    glReadPixels (0, 0, nWidth, nHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, aDumpData);
    OpenGl_AVIWriter_AVIWriter (aDumpData, nWidth, nHeight, nBitsPerPixel);
    delete[] aDumpData;
  }
#endif

  return;
}

void EXPORT
call_togl_redraw_area
(
 CALL_DEF_VIEW * aview,
 CALL_DEF_LAYER * anunderlayer,
 CALL_DEF_LAYER * anoverlayer,
 int x, int y, int width, int height
 )
{
  CMN_KEY_DATA data;

  /*
  When the exposure area size is > window size / 2 do a full redraw.
  */
  if( width*height >
    (int)(aview->DefWindow.dx*aview->DefWindow.dy)/2 ) {
      call_togl_redraw(aview,anunderlayer,anoverlayer);
      return;
    }
    /*
    Or redraw only the area in the front buffer
    */
    TsmGetWSAttri (aview->WsId, WSWindow, &data);
    if (TxglWinset (call_thedisplay, (WINDOW) data.ldata) == TSuccess)
    {
      GLint buffer;
      glGetIntegerv (GL_DRAW_BUFFER, &buffer);
      if (buffer != GL_FRONT) glDrawBuffer (GL_FRONT);
      glEnable (GL_SCISSOR_TEST);
      glScissor ((GLint )x,
                 (GLint )((int )aview->DefWindow.dy - (y + height)),
                 (GLsizei )width, (GLsizei )height);
      OpenGl_ResourceCleaner::GetInstance()->Cleanup();
      call_func_redraw_all_structs_begin (aview->WsId);
      call_subr_displayCB (aview, OCC_REDRAW_WINDOWAREA | OCC_PRE_REDRAW);
      call_togl_setplane( aview );
      if (anunderlayer->ptrLayer)
      {
        call_togl_redraw_layer2d (aview, anunderlayer);
      }
      call_func_redraw_all_structs_proc (aview->WsId);
      call_subr_displayCB (aview, OCC_REDRAW_WINDOWAREA | OCC_PRE_OVERLAY);
      if (anoverlayer->ptrLayer)
      {
        call_togl_redraw_layer2d (aview, anoverlayer);
      }
      call_subr_displayCB(aview,OCC_REDRAW_WINDOWAREA);
      call_func_redraw_all_structs_end (aview->WsId, 0);
      call_togl_redraw_immediat_mode (aview);
      glFlush();
      glDisable (GL_SCISSOR_TEST);
      if (buffer != GL_FRONT) glDrawBuffer (buffer);
    }
}