0024070: OpenGL capped object-level clipping planes
[occt.git] / src / OpenGl / OpenGl_GraphicDriver_7.cxx
CommitLineData
b311480e 1// Created on: 2011-10-20
2// Created by: Sergey ZERCHANINOV
3// Copyright (c) 2011-2012 OPEN CASCADE SAS
4//
5// The content of this file is subject to the Open CASCADE Technology Public
6// License Version 6.5 (the "License"). You may not use the content of this file
7// except in compliance with the License. Please obtain a copy of the License
8// at http://www.opencascade.org and read it completely before using this file.
9//
10// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12//
13// The Original Code and all software distributed under the License is
14// distributed on an "AS IS" basis, without warranty of any kind, and the
15// Initial Developer hereby disclaims all such warranties, including without
16// limitation, any warranties of merchantability, fitness for a particular
17// purpose or non-infringement. Please see the License for the specific terms
18// and conditions governing the rights and limitations under the License.
19
7fd59977 20
2166f0fa 21#include <OpenGl_GraphicDriver.hxx>
7fd59977 22
7fd59977 23#include <OpenGl_FrameBuffer.hxx>
24
2166f0fa
SK
25#include <OpenGl_Structure.hxx>
26#include <OpenGl_CView.hxx>
27#include <OpenGl_Display.hxx>
7fd59977 28
2166f0fa 29/*----------------------------------------------------------------------*/
7fd59977 30
2166f0fa
SK
31void OpenGl_GraphicDriver::ActivateView (const Graphic3d_CView& ACView)
32{
33 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
34 if (aCView)
35 aCView->WS->SetActiveView(aCView->View);
7fd59977 36}
37
2166f0fa
SK
38void OpenGl_GraphicDriver::AntiAliasing (const Graphic3d_CView& ACView, const Standard_Boolean AFlag)
39{
40 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
41 if (aCView)
42 aCView->View->SetAntiAliasing(AFlag);
7fd59977 43}
44
2166f0fa
SK
45void OpenGl_GraphicDriver::Background (const Graphic3d_CView& ACView)
46{
47 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
48 if (aCView)
49 {
50 aCView->WS->SetBackgroundColor(ACView.DefWindow.Background.r,ACView.DefWindow.Background.g,ACView.DefWindow.Background.b);
7fd59977 51 }
7fd59977 52}
53
2166f0fa 54void OpenGl_GraphicDriver::GradientBackground (const Graphic3d_CView& ACView,
7fd59977 55 const Quantity_Color& AColor1,
56 const Quantity_Color& AColor2,
2166f0fa
SK
57 const Aspect_GradientFillMethod AType)
58{
59 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
60 if (aCView)
61 {
62 aCView->View->SetBackgroundGradient(AColor1,AColor2,AType);
7fd59977 63 }
7fd59977 64}
65
2166f0fa
SK
66void OpenGl_GraphicDriver::Blink (const Graphic3d_CStructure &, const Standard_Boolean)
67{
68 // Do nothing
7fd59977 69}
70
5e27df78 71void OpenGl_GraphicDriver::BoundaryBox (const Graphic3d_CStructure& theCStructure,
72 const Standard_Boolean toCreate)
2166f0fa 73{
5e27df78 74 OpenGl_Structure* aStructure = (OpenGl_Structure* )theCStructure.ptrStructure;
75 if (aStructure == NULL)
2166f0fa 76 return;
7fd59977 77
5e27df78 78 if (toCreate)
79 aStructure->SetHighlightBox (GetSharedContext(), theCStructure.BoundBox);
2166f0fa 80 else
5e27df78 81 aStructure->ClearHighlightBox (GetSharedContext());
7fd59977 82}
83
5e27df78 84void OpenGl_GraphicDriver::HighlightColor (const Graphic3d_CStructure& theCStructure,
85 const Standard_ShortReal R,
86 const Standard_ShortReal G,
87 const Standard_ShortReal B,
88 const Standard_Boolean toCreate)
2166f0fa 89{
5e27df78 90 OpenGl_Structure* aStructure = (OpenGl_Structure* )theCStructure.ptrStructure;
91 if (aStructure == NULL)
2166f0fa 92 return;
7fd59977 93
5e27df78 94 if (toCreate)
95 aStructure->SetHighlightColor (GetSharedContext(), R, G, B);
2166f0fa 96 else
5e27df78 97 aStructure->ClearHighlightColor (GetSharedContext());
7fd59977 98}
99
2166f0fa
SK
100void OpenGl_GraphicDriver::NameSetStructure (const Graphic3d_CStructure& ACStructure)
101{
102 OpenGl_Structure *astructure = (OpenGl_Structure *)ACStructure.ptrStructure;
103 if (astructure)
104 {
105 Standard_Integer aStatus = 0;
106 if (ACStructure.highlight) aStatus |= OPENGL_NS_HIGHLIGHT;
107 if (!ACStructure.visible) aStatus |= OPENGL_NS_HIDE;
2166f0fa 108 astructure->SetNamedStatus( aStatus );
7fd59977 109 }
7fd59977 110}
111
2166f0fa
SK
112void OpenGl_GraphicDriver::ClipLimit (const Graphic3d_CView& ACView, const Standard_Boolean AWait)
113{
114 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
115 if (aCView)
116 {
117 aCView->View->SetClipLimit(ACView);
529afc1a 118 if (!AWait)
2166f0fa
SK
119 {
120 aCView->WS->Resize(ACView.DefWindow);
2166f0fa 121 }
7fd59977 122 }
7fd59977 123}
124
2166f0fa
SK
125void OpenGl_GraphicDriver::DeactivateView (const Graphic3d_CView& ACView)
126{
127 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
128 if (aCView)
129 {
130 const Handle(OpenGl_View) aDummyView;
131 aCView->WS->SetActiveView(aDummyView);
7fd59977 132 }
7fd59977 133}
134
2166f0fa
SK
135void OpenGl_GraphicDriver::DepthCueing (const Graphic3d_CView& ACView, const Standard_Boolean AFlag)
136{
137 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
138 if (aCView)
139 aCView->View->SetFog(ACView, AFlag);
7fd59977 140}
141
2166f0fa
SK
142Standard_Boolean OpenGl_GraphicDriver::ProjectRaster (const Graphic3d_CView& ACView, const Standard_ShortReal AX, const Standard_ShortReal AY, const Standard_ShortReal AZ, Standard_Integer& AU, Standard_Integer& AV)
143{
144 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
145 if (!aCView)
146 return Standard_False;
7fd59977 147
2166f0fa
SK
148 Standard_Integer aWidth = aCView->WS->Width();
149 Standard_Integer aHeight = aCView->WS->Height();
2166f0fa
SK
150 Standard_ShortReal xr, yr;
151 if (aCView->View->ProjectObjectToRaster(aWidth, aHeight, AX, AY, AZ, xr, yr))
152 {
153 AU = (Standard_Integer) xr;
154 AV = aHeight - (Standard_Integer) yr;
155 return Standard_True;
7fd59977 156 }
157
2166f0fa 158 return Standard_False;
7fd59977 159}
160
35e08fe8 161Standard_Boolean OpenGl_GraphicDriver::UnProjectRaster (const Graphic3d_CView& ACView, const Standard_Integer /*Axm*/, const Standard_Integer Aym, const Standard_Integer /*AXM*/, const Standard_Integer AYM, const Standard_Integer AU, const Standard_Integer AV, Standard_ShortReal& Ax, Standard_ShortReal& Ay, Standard_ShortReal& Az)
2166f0fa
SK
162{
163 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
164 if (!aCView)
165 return Standard_False;
7fd59977 166
2166f0fa
SK
167 const Standard_Integer aWidth = aCView->WS->Width();
168 const Standard_Integer aHeight = aCView->WS->Height();
7fd59977 169
2166f0fa 170 /*
bf75be98 171 Patched by P.Dolbey: the window pixel height decreased by one
2166f0fa
SK
172 in order for yr to remain within valid coordinate range [0; Ym -1]
173 where Ym means window pixel height.
174 */
175 return aCView->View->ProjectRasterToObject( aWidth, aHeight, AU, (AYM-1)-Aym-AV, Ax, Ay, Az );
7fd59977 176}
177
35e08fe8 178Standard_Boolean OpenGl_GraphicDriver::UnProjectRasterWithRay (const Graphic3d_CView& ACView, const Standard_Integer /*Axm*/, const Standard_Integer Aym, const Standard_Integer /*AXM*/, const Standard_Integer AYM, const Standard_Integer AU, const Standard_Integer AV, Standard_ShortReal& Ax, Standard_ShortReal& Ay, Standard_ShortReal& Az, Standard_ShortReal& Dx, Standard_ShortReal& Dy, Standard_ShortReal& Dz)
2166f0fa
SK
179{
180 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
181 if (!aCView)
182 return Standard_False;
7fd59977 183
2166f0fa
SK
184 const Standard_Integer aWidth = aCView->WS->Width();
185 const Standard_Integer aHeight = aCView->WS->Height();
7fd59977 186
2166f0fa 187 return aCView->View->ProjectRasterToObjectWithRay( aWidth, aHeight, AU, AYM-Aym-AV, Ax, Ay, Az, Dx, Dy, Dz );
7fd59977 188}
189
529afc1a 190void OpenGl_GraphicDriver::RatioWindow (const Graphic3d_CView& theCView)
2166f0fa 191{
529afc1a
K
192 const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
193 if (aCView != NULL)
194 aCView->WS->Resize (theCView.DefWindow);
2166f0fa 195}
7fd59977 196
35e08fe8 197void OpenGl_GraphicDriver::Redraw (const Graphic3d_CView& ACView,
198 const Aspect_CLayer2d& ACUnderLayer,
199 const Aspect_CLayer2d& ACOverLayer,
200 const Standard_Integer /*x*/,
201 const Standard_Integer /*y*/,
202 const Standard_Integer /*width*/,
203 const Standard_Integer /*height*/)
2166f0fa
SK
204{
205 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
206 if (aCView)
207 {
208 /*if( width <= 0 || height <= 0 )
209 aCView->WS->Redraw(ACView, ACUnderLayer, ACOverLayer);
210 else
211 aCView->WS->RedrawArea(ACView, ACUnderLayer, ACOverLayer, x, y, width, height);*/
212 // Always do full redraw
213 aCView->WS->Redraw(ACView, ACUnderLayer, ACOverLayer);
7fd59977 214 }
7fd59977 215}
216
2166f0fa
SK
217Graphic3d_PtrFrameBuffer OpenGl_GraphicDriver::FBOCreate (const Graphic3d_CView& ACView, const Standard_Integer theWidth, const Standard_Integer theHeight)
218{
219 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
220 if (aCView)
221 return aCView->WS->FBOCreate(theWidth, theHeight);
222 return (Graphic3d_PtrFrameBuffer)NULL;
7fd59977 223}
224
2166f0fa
SK
225Graphic3d_PtrFrameBuffer OpenGl_Workspace::FBOCreate (const Standard_Integer theWidth, const Standard_Integer theHeight)
226{
7fd59977 227 // activate OpenGL context
2166f0fa 228 if (!Activate())
7fd59977 229 return NULL;
2166f0fa 230
7fd59977 231 // create the FBO
232 OpenGl_FrameBuffer* aFrameBuffer = new OpenGl_FrameBuffer();
2166f0fa 233 if (!aFrameBuffer->Init (GetGlContext(), theWidth, theHeight))
7fd59977 234 {
235 delete aFrameBuffer;
236 return NULL;
237 }
238 return (Graphic3d_PtrFrameBuffer )aFrameBuffer;
239}
240
2166f0fa 241void OpenGl_GraphicDriver::FBORelease (const Graphic3d_CView& ACView, Graphic3d_PtrFrameBuffer& theFBOPtr)
7fd59977 242{
243 if (theFBOPtr == NULL)
7fd59977 244 return;
2166f0fa
SK
245 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
246 if (aCView)
247 {
248 aCView->WS->FBORelease(theFBOPtr);
249 theFBOPtr = NULL;
7fd59977 250 }
2166f0fa
SK
251}
252
253void OpenGl_Workspace::FBORelease (Graphic3d_PtrFrameBuffer theFBOPtr)
254{
7fd59977 255 // activate OpenGL context
2166f0fa 256 if (!Activate())
7fd59977 257 return;
2166f0fa 258
7fd59977 259 // release the object
2166f0fa
SK
260 OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer*)theFBOPtr;
261 aFrameBuffer->Release (GetGlContext());
7fd59977 262 delete aFrameBuffer;
7fd59977 263}
264
265void OpenGl_GraphicDriver::FBOGetDimensions (const Graphic3d_CView& ,
266 const Graphic3d_PtrFrameBuffer theFBOPtr,
267 Standard_Integer& theWidth, Standard_Integer& theHeight,
268 Standard_Integer& theWidthMax, Standard_Integer& theHeightMax)
269{
270 if (theFBOPtr == NULL)
271 {
272 return;
273 }
274 const OpenGl_FrameBuffer* aFrameBuffer = (const OpenGl_FrameBuffer* )theFBOPtr;
275 theWidth = aFrameBuffer->GetVPSizeX(); // current viewport size
276 theHeight = aFrameBuffer->GetVPSizeY();
277 theWidthMax = aFrameBuffer->GetSizeX(); // texture size
278 theHeightMax = aFrameBuffer->GetSizeY();
279}
280
281void OpenGl_GraphicDriver::FBOChangeViewport (const Graphic3d_CView& ,
282 Graphic3d_PtrFrameBuffer& theFBOPtr,
283 const Standard_Integer theWidth, const Standard_Integer theHeight)
284{
285 if (theFBOPtr == NULL)
286 {
287 return;
288 }
289 OpenGl_FrameBuffer* aFrameBuffer = (OpenGl_FrameBuffer* )theFBOPtr;
290 aFrameBuffer->ChangeViewport (theWidth, theHeight);
291}
292
692613e5 293inline bool getDataFormat (const Image_PixMap& theData,
294 GLenum& thePixelFormat,
295 GLenum& theDataType)
7fd59977 296{
692613e5 297 thePixelFormat = GL_RGB;
298 theDataType = GL_UNSIGNED_BYTE;
299 switch (theData.Format())
7fd59977 300 {
692613e5 301 case Image_PixMap::ImgGray:
302 thePixelFormat = GL_DEPTH_COMPONENT;
303 theDataType = GL_UNSIGNED_BYTE;
304 return true;
305 case Image_PixMap::ImgRGB:
306 thePixelFormat = GL_RGB;
307 theDataType = GL_UNSIGNED_BYTE;
308 return true;
309 case Image_PixMap::ImgBGR:
310 thePixelFormat = GL_BGR;
311 theDataType = GL_UNSIGNED_BYTE;
312 return true;
313 case Image_PixMap::ImgRGBA:
314 case Image_PixMap::ImgRGB32:
315 thePixelFormat = GL_RGBA;
316 theDataType = GL_UNSIGNED_BYTE;
317 return true;
318 case Image_PixMap::ImgBGRA:
319 case Image_PixMap::ImgBGR32:
320 thePixelFormat = GL_BGRA;
321 theDataType = GL_UNSIGNED_BYTE;
322 return true;
323 case Image_PixMap::ImgGrayF:
324 thePixelFormat = GL_DEPTH_COMPONENT;
325 theDataType = GL_FLOAT;
326 return true;
327 case Image_PixMap::ImgRGBF:
328 thePixelFormat = GL_RGB;
329 theDataType = GL_FLOAT;
330 return true;
331 case Image_PixMap::ImgBGRF:
332 thePixelFormat = GL_BGR;
333 theDataType = GL_FLOAT;
334 return true;
335 case Image_PixMap::ImgRGBAF:
336 thePixelFormat = GL_RGBA;
337 theDataType = GL_FLOAT;
338 return true;
339 case Image_PixMap::ImgBGRAF:
340 thePixelFormat = GL_BGRA;
341 theDataType = GL_FLOAT;
342 return true;
343 default:
344 return false;
7fd59977 345 }
346}
347
692613e5 348Standard_Boolean OpenGl_GraphicDriver::BufferDump (const Graphic3d_CView& theCView,
349 Image_PixMap& theImage,
350 const Graphic3d_BufferType& theBufferType)
7fd59977 351{
692613e5 352 const OpenGl_CView* aCView = (const OpenGl_CView* )theCView.ptrView;
353 return (aCView != NULL) && aCView->WS->BufferDump ((OpenGl_FrameBuffer* )theCView.ptrFBO, theImage, theBufferType);
2166f0fa
SK
354}
355
692613e5 356Standard_Boolean OpenGl_Workspace::BufferDump (OpenGl_FrameBuffer* theFBOPtr,
357 Image_PixMap& theImage,
358 const Graphic3d_BufferType& theBufferType)
7fd59977 359{
692613e5 360 GLenum aFormat, aType;
361 if (theImage.IsEmpty()
362 || !getDataFormat (theImage, aFormat, aType)
363 || ((theBufferType == Graphic3d_BT_Depth) && (aFormat != GL_DEPTH_COMPONENT))
364 || !Activate())
7fd59977 365 {
366 return Standard_False;
367 }
368
7fd59977 369 // bind FBO if used
7fd59977 370 GLint aReadBufferPrev = GL_BACK;
692613e5 371 if (theFBOPtr != NULL && theFBOPtr->IsValid())
7fd59977 372 {
692613e5 373 theFBOPtr->BindBuffer (GetGlContext());
7fd59977 374 }
375 else
376 {
377 glGetIntegerv (GL_READ_BUFFER, &aReadBufferPrev);
378 GLint aDrawBufferPrev = GL_BACK;
379 glGetIntegerv (GL_DRAW_BUFFER, &aDrawBufferPrev);
380 glReadBuffer (aDrawBufferPrev);
381 }
382
383 GLint anAlignBack = 1;
384 glGetIntegerv (GL_PACK_ALIGNMENT, &anAlignBack);
692613e5 385 GLint anExtraBytes = (GLint )theImage.RowExtraBytes();
386 GLint anAligment = Min (GLint(theImage.MaxRowAligmentBytes()), 8); // limit to 8 bytes for OpenGL
387 glPixelStorei (GL_PACK_ALIGNMENT, anAligment);
388
389 if (anExtraBytes >= anAligment)
390 {
391 // copy row by row
392 for (Standard_Size aRow = 0; aRow < theImage.SizeY(); ++aRow)
393 {
394 glReadPixels (0, GLint(aRow), GLsizei (theImage.SizeX()), 1, aFormat, aType, theImage.ChangeRow (aRow));
395 }
396 }
397 else
7fd59977 398 {
692613e5 399 // read pixels
400 glReadPixels (0, 0, GLsizei (theImage.SizeX()), GLsizei (theImage.SizeY()), aFormat, aType, theImage.ChangeData());
401 theImage.SetTopDown (false); // image bottom-up in OpenGL
7fd59977 402 }
7fd59977 403
7fd59977 404 glPixelStorei (GL_PACK_ALIGNMENT, anAlignBack);
405
692613e5 406 if (theFBOPtr != NULL && theFBOPtr->IsValid())
7fd59977 407 {
692613e5 408 theFBOPtr->UnbindBuffer (GetGlContext());
7fd59977 409 }
410 else
411 {
412 glReadBuffer (aReadBufferPrev);
413 }
414 return Standard_True;
415}
416
dd8a4ce9 417void OpenGl_GraphicDriver::RemoveView (const Graphic3d_CView& theCView)
2166f0fa 418{
dd8a4ce9 419 Handle(OpenGl_Context) aShareCtx = GetSharedContext();
420 if (myMapOfView.IsBound (theCView.ViewId))
421 myMapOfView.UnBind (theCView.ViewId);
7fd59977 422
dd8a4ce9 423 if (myMapOfWS.IsBound (theCView.WsId))
424 myMapOfWS.UnBind (theCView.WsId);
7fd59977 425
dd8a4ce9 426 if (myMapOfWS.IsEmpty() && !myMapOfStructure.IsEmpty())
427 {
428 // The last view removed but some objects still present.
429 // Release GL resources now without object destruction.
430 for (NCollection_DataMap<Standard_Integer, OpenGl_Structure*>::Iterator aStructIt (myMapOfStructure);
431 aStructIt.More (); aStructIt.Next())
432 {
433 OpenGl_Structure* aStruct = aStructIt.ChangeValue();
434 aStruct->ReleaseGlResources (aShareCtx);
435 }
436 }
437
bf75be98 438 OpenGl_CView* aCView = (OpenGl_CView* )theCView.ptrView;
439 aCView->View->ReleaseGlResources (aShareCtx);
2166f0fa 440 delete aCView;
dd8a4ce9 441 ((Graphic3d_CView *)&theCView)->ptrView = NULL;
7fd59977 442}
443
2166f0fa
SK
444void OpenGl_GraphicDriver::SetLight (const Graphic3d_CView& ACView)
445{
446 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
447 if (aCView)
448 aCView->View->SetLights(ACView.Context);
7fd59977 449}
450
4269bd1b 451void OpenGl_GraphicDriver::SetClipPlanes (const Graphic3d_CView& theCView)
2166f0fa 452{
4269bd1b 453 const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
2166f0fa 454 if (aCView)
4269bd1b 455 {
456 aCView->View->SetClipPlanes (theCView.Context.ClipPlanes);
457 }
458}
459
460void OpenGl_GraphicDriver::SetClipPlanes (const Graphic3d_CStructure& theCStructure)
461{
462 OpenGl_Structure* aStructure = (OpenGl_Structure *)theCStructure.ptrStructure;
463 if (aStructure)
464 {
465 aStructure->SetClipPlanes (theCStructure.ClipPlanes);
466 }
7fd59977 467}
468
2166f0fa
SK
469void OpenGl_GraphicDriver::SetVisualisation (const Graphic3d_CView& ACView)
470{
471 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
472 if (aCView)
473 {
474 aCView->View->SetVisualisation(ACView.Context);
475 aCView->WS->UseZBuffer() = ( ACView.Context.Visualization == 0? (ACView.Context.ZBufferActivity == 1) : (ACView.Context.ZBufferActivity != 0) );
7fd59977 476 }
7fd59977 477}
478
2166f0fa
SK
479void OpenGl_GraphicDriver::TransformStructure (const Graphic3d_CStructure& ACStructure)
480{
481 OpenGl_Structure *astructure = (OpenGl_Structure *)ACStructure.ptrStructure;
482 if (astructure)
483 astructure->SetTransformation(&(ACStructure.Transformation[0][0]));
7fd59977 484}
485
2166f0fa
SK
486void OpenGl_GraphicDriver::Transparency (const Graphic3d_CView& ACView, const Standard_Boolean AFlag)
487{
488 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
489 if (aCView)
490 aCView->WS->UseTransparency(AFlag);
491}
7fd59977 492
2166f0fa
SK
493void OpenGl_GraphicDriver::Update (const Graphic3d_CView& ACView, const Aspect_CLayer2d& ACUnderLayer, const Aspect_CLayer2d& ACOverLayer)
494{
495 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
496 if (aCView)
497 aCView->WS->Update(ACView,ACUnderLayer,ACOverLayer);
498}
7fd59977 499
5e27df78 500Standard_Boolean OpenGl_GraphicDriver::View (Graphic3d_CView& theCView)
2166f0fa
SK
501{
502 if (openglDisplay.IsNull())
503 return Standard_False;
7fd59977 504
5e27df78 505 if (myMapOfView.IsBound (theCView.ViewId))
506 myMapOfView.UnBind (theCView.ViewId);
7fd59977 507
5e27df78 508 if (myMapOfWS.IsBound (theCView.WsId))
509 myMapOfWS.UnBind (theCView.WsId);
7fd59977 510
5e27df78 511 Handle(OpenGl_Workspace) aWS = Handle(OpenGl_Workspace)::DownCast(openglDisplay->GetWindow (theCView.DefWindow.XWindow));
512 if (aWS.IsNull())
2166f0fa 513 {
5e27df78 514 Handle(OpenGl_Context) aShareCtx = GetSharedContext();
58655684 515 aWS = new OpenGl_Workspace (openglDisplay, theCView.DefWindow, theCView.GContext, myCaps, aShareCtx);
5e27df78 516 openglDisplay->SetWindow (theCView.DefWindow.XWindow, aWS);
7fd59977 517 }
518
5e27df78 519 myMapOfWS.Bind (theCView.WsId, aWS);
7fd59977 520
5e27df78 521 Handle(OpenGl_View) aView = new OpenGl_View (theCView.Context);
522 myMapOfView.Bind (theCView.ViewId, aView);
7fd59977 523
5e27df78 524 OpenGl_CView* aCView = new OpenGl_CView();
2166f0fa
SK
525 aCView->View = aView;
526 aCView->WS = aWS;
5e27df78 527 theCView.ptrView = aCView;
7fd59977 528
2166f0fa
SK
529 return Standard_True;
530}
7fd59977 531
2166f0fa
SK
532void OpenGl_GraphicDriver::ViewMapping (const Graphic3d_CView& ACView, const Standard_Boolean AWait)
533{
534 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
535 if (aCView)
536 {
537 aCView->View->SetMapping(ACView);
529afc1a 538 if (!AWait)
2166f0fa
SK
539 {
540 aCView->WS->Resize(ACView.DefWindow);
7fd59977 541 }
7fd59977 542 }
2166f0fa 543}
7fd59977 544
2166f0fa
SK
545void OpenGl_GraphicDriver::ViewOrientation (const Graphic3d_CView& ACView, const Standard_Boolean AWait)
546{
547 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
548 if (aCView)
549 {
550 aCView->View->SetOrientation(ACView);
529afc1a 551 if (!AWait)
2166f0fa
SK
552 {
553 aCView->WS->Resize(ACView.DefWindow);
7fd59977 554 }
7fd59977 555 }
2166f0fa 556}
7fd59977 557
2166f0fa
SK
558void OpenGl_GraphicDriver::SetBackFacingModel (const Graphic3d_CView& ACView)
559{
560 const OpenGl_CView *aCView = (const OpenGl_CView *)ACView.ptrView;
561 if (aCView)
562 aCView->View->SetBackfacing(ACView.Backfacing);
563}
59f45b7c 564
565//=======================================================================
566//function : AddZLayer
bf75be98 567//purpose :
59f45b7c 568//=======================================================================
569
570void OpenGl_GraphicDriver::AddZLayer (const Graphic3d_CView& theCView,
571 const Standard_Integer theLayerId)
572{
573 const OpenGl_CView *aCView = (const OpenGl_CView *)theCView.ptrView;
574 if (aCView)
575 aCView->View->AddZLayer (theLayerId);
576}
577
578//=======================================================================
579//function : RemoveZLayer
580//purpose :
581//=======================================================================
582
583void OpenGl_GraphicDriver::RemoveZLayer (const Graphic3d_CView& theCView,
584 const Standard_Integer theLayerId)
585{
586 const OpenGl_CView* aCView = (const OpenGl_CView *)theCView.ptrView;
587 if (aCView)
588 aCView->View->RemoveZLayer (theLayerId);
589}