Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4OpenGLWin32Viewer.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29//
30// G4OpenGLWin32Viewer : Class to provide WindowsNT specific
31// functionality for OpenGL in GEANT4
32//
33// 27/06/2003 : G.Barrand : implementation (at last !).
34
35#ifdef G4VIS_BUILD_OPENGLWIN32_DRIVER
36
38#include "G4VViewer.hh"
39#include "G4VSceneHandler.hh"
41
42#include "G4ios.hh"
43#include "G4VisExtent.hh"
44#include "G4LogicalVolume.hh"
45#include "G4VSolid.hh"
46#include "G4Point3D.hh"
47#include "G4Normal3D.hh"
48
49
50//////////////////////////////////////////////////////////////////////////////
51void G4OpenGLWin32Viewer::SetView (
52)
53//////////////////////////////////////////////////////////////////////////////
54//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
55{
56 if(!fHDC) return;
57 if(!fHGLRC) return;
58 ::wglMakeCurrent(fHDC,fHGLRC);
59 G4OpenGLViewer::SetView ();
60}
61
62//////////////////////////////////////////////////////////////////////////////
63void G4OpenGLWin32Viewer::ShowView (
64)
65//////////////////////////////////////////////////////////////////////////////
66//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
67{
68 if(!fHDC) return;
69 glFlush ();
70 // Empty the Windows message queue :
71 MSG event;
72 while ( ::PeekMessage(&event, NULL, 0, 0, PM_REMOVE) ) {
73 ::TranslateMessage(&event);
74 ::DispatchMessage (&event);
75 }
76}
77
78//////////////////////////////////////////////////////////////////////////////
79void G4OpenGLWin32Viewer::GetWin32Connection (
80)
81//////////////////////////////////////////////////////////////////////////////
82//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
83{
84}
85
86//////////////////////////////////////////////////////////////////////////////
87void G4OpenGLWin32Viewer::CreateGLWin32Context (
88)
89//////////////////////////////////////////////////////////////////////////////
90//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
91{
92}
93
94//////////////////////////////////////////////////////////////////////////////
95void G4OpenGLWin32Viewer::CreateMainWindow (
96)
97//////////////////////////////////////////////////////////////////////////////
98//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
99{
100 if(fWindow) return; //Done.
101
102 // Bill Gates stuff...
103 static const char className[] = "G4OpenGLWin32";
104 static bool done = false;
105 if(done==false) {
106 WNDCLASS wc;
107 wc.style = CS_HREDRAW | CS_VREDRAW;
108 wc.lpfnWndProc = (WNDPROC)WindowProc;
109 wc.cbClsExtra = 0;
110 wc.cbWndExtra = 0;
111 wc.hInstance = ::GetModuleHandle(NULL);
112 wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
113 wc.hCursor = LoadCursor(NULL,IDC_CROSS);
114 wc.hbrBackground = NULL;
115 wc.lpszMenuName = className;
116 wc.lpszClassName = className;
117 ::RegisterClass(&wc);
118 done = true;
119 }
120
121 ResizeWindow(fVP.GetWindowSizeHintX(),fVP.GetWindowSizeHintY());
122
123 int x_res=GetSystemMetrics(SM_CXSCREEN);
124 int y_res=GetSystemMetrics(SM_CYSCREEN);
125
126 //FIXME : NOT tested !
127 fWindow = ::CreateWindow(className,fName.c_str(),
128 WS_OVERLAPPEDWINDOW,
129 //WS_CHILD | WS_VISIBLE,
130 // 0,0,
131 fVP.GetWindowAbsoluteLocationHintX(x_res),
132 fVP.GetWindowAbsoluteLocationHintY(y_res),
133 getWinWidth(), getWinHeight(),
134 NULL, NULL,
135 ::GetModuleHandle(NULL),
136 NULL);
137 if(!fWindow) return;
138
139 ::SetWindowLongPtr(fWindow,GWLP_USERDATA,LONG(this));
140
141 // initialize OpenGL rendering :
142 fHDC = ::GetDC(fWindow);
143 if( fHDC && (SetWindowPixelFormat(fHDC)==TRUE) ) {
144 fHGLRC = ::wglCreateContext(fHDC);
145 }
146
147 if(fHDC && fHGLRC) {
148 ::wglMakeCurrent(fHDC,fHGLRC);
149 }
150
151 ::SetForegroundWindow(fWindow);
152 ::ShowWindow(fWindow,SW_SHOWDEFAULT);
153 ::UpdateWindow(fWindow);
154 ::DrawMenuBar(fWindow);
155}
156
157//////////////////////////////////////////////////////////////////////////////
158G4OpenGLWin32Viewer::G4OpenGLWin32Viewer (
159 G4OpenGLSceneHandler& scene
160)
161:G4VViewer (scene, -1)
162,G4OpenGLViewer (scene)
163,fWindow(0)
164,fHDC(0)
165,fHGLRC(0)
166//////////////////////////////////////////////////////////////////////////////
167//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
168{
169}
170
171//////////////////////////////////////////////////////////////////////////////
172G4OpenGLWin32Viewer::~G4OpenGLWin32Viewer (
173)
174//////////////////////////////////////////////////////////////////////////////
175//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
176{
177 // This is the end (Jim Morisson).
178 if (fViewId >= 0) {
179 if(wglGetCurrentContext()!=NULL) wglMakeCurrent(NULL,NULL);
180 if(fHGLRC) {
181 wglDeleteContext(fHGLRC);
182 fHGLRC = NULL;
183 }
184
185 if(fWindow) {
186 ::SetWindowLongPtr(fWindow,GWLP_USERDATA,LONG(NULL));
187 if(fHDC) ::ReleaseDC(fWindow,fHDC);
188 ::DestroyWindow(fWindow);
189 }
190 }
191}
192
193//////////////////////////////////////////////////////////////////////////////
194LRESULT CALLBACK G4OpenGLWin32Viewer::WindowProc (
195 HWND aWindow
196,UINT aMessage
197,WPARAM aWParam
198,LPARAM aLParam
199)
200//////////////////////////////////////////////////////////////////////////////
201//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
202{
203/*
204 switch (aMessage) {
205 case WM_PAINT:{
206 printf("debug : PAINT\n");
207 HDC hDC;
208 PAINTSTRUCT ps;
209 hDC = BeginPaint(aWindow,&ps);
210 if(This) {
211 // FIXME : To have an automatic refresh someone have to redraw here.
212 }
213 EndPaint(aWindow, &ps);
214
215 //FIXME : have to handle WM_RESIZE
216 //pView->fWinSize_x = (G4int) width;
217 //pView->fWinSize_y = (G4int) height;
218 G4OpenGLWin32Viewer* This =
219 (G4OpenGLWin32Viewer*)::GetWindowLong(aWindow,GWL_USERDATA);
220 if(This) {
221 This->SetView();
222 glViewport(0,0,This->fWinSize_x,This->fWinSize_y);
223 This->ClearView();
224 This->DrawView();
225 // WARNING : the below empty the Windows message queue...
226 This->FinishView();
227 }
228 } return 0;
229 default:
230 return DefWindowProc(aWindow,aMessage,aWParam,aLParam);
231 }
232*/
233 return DefWindowProc(aWindow,aMessage,aWParam,aLParam);
234}
235
236//////////////////////////////////////////////////////////////////////////////
237bool G4OpenGLWin32Viewer::SetWindowPixelFormat(
238 HDC aHdc
239)
240//////////////////////////////////////////////////////////////////////////////
241//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
242{
243 // The ungessable...
244
245 PIXELFORMATDESCRIPTOR pfd;
246 pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
247 pfd.nVersion = 1;
248 pfd.dwFlags =
249 PFD_DRAW_TO_WINDOW |
250 PFD_SUPPORT_OPENGL |
251 PFD_DOUBLEBUFFER |
252 PFD_STEREO_DONTCARE;
253 pfd.iPixelType = PFD_TYPE_RGBA;
254 pfd.cColorBits = 32;
255 pfd.cRedBits = 8;
256 pfd.cRedShift = 16;
257 pfd.cGreenBits = 8;
258 pfd.cGreenShift = 8;
259 pfd.cBlueBits = 8;
260 pfd.cBlueShift = 0;
261 pfd.cAlphaBits = 0;
262 pfd.cAlphaShift = 0;
263 pfd.cAccumBits = 64;
264 pfd.cAccumRedBits = 16;
265 pfd.cAccumGreenBits = 16;
266 pfd.cAccumBlueBits = 16;
267 pfd.cAccumAlphaBits = 0;
268 pfd.cDepthBits = 32;
269 pfd.cStencilBits = 8;
270 pfd.cAuxBuffers = 0;
271 pfd.iLayerType = PFD_MAIN_PLANE;
272 pfd.bReserved = 0;
273 pfd.dwLayerMask = 0;
274 pfd.dwVisibleMask = 0;
275 pfd.dwDamageMask = 0;
276
277 int pixelIndex = ::ChoosePixelFormat(aHdc,&pfd);
278 if (pixelIndex==0) {
279 pixelIndex = 1;
280 if (::DescribePixelFormat(aHdc,
281 pixelIndex,
282 sizeof(PIXELFORMATDESCRIPTOR),
283 &pfd)==0) {
284 return false;
285 }
286 }
287 if (::SetPixelFormat(aHdc,pixelIndex,&pfd)==FALSE) return false;
288 return true;
289}
290
291
292#endif
#define TRUE
Definition: globals.hh:55
#define FALSE
Definition: globals.hh:52