0024166: Unable to create file with "Save" menu of voxeldemo Qt sample
[occt.git] / src / OpenGl / OpenGl_CappingPlaneResource.cxx
CommitLineData
4269bd1b 1// Created on: 2013-08-15
2// Created by: Anton POLETAEV
3// Copyright (c) 2013 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
20#include <OpenGl_CappingPlaneResource.hxx>
21#include <OpenGl_Context.hxx>
22#include <OpenGl_Vec.hxx>
23#include <Precision.hxx>
24
25IMPLEMENT_STANDARD_HANDLE (OpenGl_CappingPlaneResource, OpenGl_Resource)
26IMPLEMENT_STANDARD_RTTIEXT(OpenGl_CappingPlaneResource, OpenGl_Resource)
27
28// =======================================================================
29// function : OpenGl_CappingPlaneResource
30// purpose :
31// =======================================================================
32OpenGl_CappingPlaneResource::OpenGl_CappingPlaneResource (const Handle(Graphic3d_ClipPlane)& thePlane)
33: myOrientation (OpenGl_IdentityMatrix),
34 myAspect (NULL),
35 myPlaneRoot (thePlane),
36 myEquationMod (0),
37 myAspectMod (0)
38{}
39
40// =======================================================================
41// function : OpenGl_CappingPlaneResource
42// purpose :
43// =======================================================================
44OpenGl_CappingPlaneResource::~OpenGl_CappingPlaneResource()
45{
46 Release (NULL);
47}
48
49// =======================================================================
50// function : Update
51// purpose :
52// =======================================================================
53void OpenGl_CappingPlaneResource::Update (const Handle(OpenGl_Context)& theContext)
54{
55 UpdateTransform();
56 UpdateAspect (theContext);
57}
58
59// =======================================================================
60// function : Release
61// purpose :
62// =======================================================================
63void OpenGl_CappingPlaneResource::Release (const OpenGl_Context* theContext)
64{
65 OpenGl_Element::Destroy (theContext, myAspect);
66 myEquationMod = 0;
67 myAspectMod = 0;
68}
69
70// =======================================================================
71// function : UpdateAspect
72// purpose :
73// =======================================================================
74void OpenGl_CappingPlaneResource::UpdateAspect (const Handle(OpenGl_Context)& theContext)
75{
76 Handle(Graphic3d_AspectFillArea3d) aCappingAsp = myPlaneRoot->CappingAspect();
77 if (myAspect != NULL && !aCappingAsp.IsNull())
78 {
79 if (myAspectMod == myPlaneRoot->MCountAspect())
80 return; // noting to update
81
fd4a6963 82 myAspect->SetAspect (aCappingAsp);
4269bd1b 83 myAspectMod = myPlaneRoot->MCountAspect();
84 return;
85 }
86
87 // no more used
88 if (myAspect != NULL && aCappingAsp.IsNull())
89 {
90 OpenGl_Element::Destroy (theContext, myAspect);
91 myAspectMod = myPlaneRoot->MCountAspect();
92 return;
93 }
94
95 // first created
96 if (myAspect == NULL && !aCappingAsp.IsNull())
97 {
98 myAspect = new OpenGl_AspectFace();
fd4a6963 99 myAspect->SetAspect (aCappingAsp);
4269bd1b 100 myAspectMod = myPlaneRoot->MCountAspect();
101 }
102}
103
104// =======================================================================
105// function : UpdateTransform
106// purpose :
107// =======================================================================
108void OpenGl_CappingPlaneResource::UpdateTransform()
109{
110 const Graphic3d_ClipPlane::Equation& anEquation = myPlaneRoot->GetEquation();
111 if (myEquationMod == myPlaneRoot->MCountEquation())
112 {
113 return; // nothing to update
114 }
115
116 // re-evaluate infinite plane transformation matrix
117 Standard_ShortReal N[3] =
118 { (Standard_ShortReal)anEquation[0],
119 (Standard_ShortReal)anEquation[1],
120 (Standard_ShortReal)anEquation[2] };
121
122 Standard_ShortReal T[3] =
123 { (Standard_ShortReal)(anEquation[0] * -anEquation[3]),
124 (Standard_ShortReal)(anEquation[1] * -anEquation[3]),
125 (Standard_ShortReal)(anEquation[2] * -anEquation[3]) };
126
127 Standard_ShortReal L[3] = { 0.0f, 0.0f, 0.0f };
128 Standard_ShortReal F[3] = { 0.0f, 0.0f, 0.0f };
129
130 // project plane normal onto OX to find left vector
131 Standard_ShortReal aConfusion = (Standard_ShortReal)Precision::Confusion();
132 Standard_ShortReal aProjLen =
133 sqrt ( (Standard_ShortReal)(anEquation[0] * anEquation[0])
134 + (Standard_ShortReal)(anEquation[2] * anEquation[2]));
135 if (aProjLen < aConfusion)
136 {
137 L[0] = 1.0f;
138 }
139 else
140 {
141 L[0] = N[2] / aProjLen;
142 L[2] = -N[0] / aProjLen;
143 }
144
145 // (-aLeft) x aNorm
146 F[0] = (-L[1])*N[2] - (-L[2])*N[1];
147 F[1] = (-L[2])*N[0] - (-L[0])*N[2];
148 F[2] = (-L[0])*N[1] - (-L[1])*N[0];
149
150 myOrientation.mat[0][0] = L[0];
151 myOrientation.mat[0][1] = L[1];
152 myOrientation.mat[0][2] = L[2];
153 myOrientation.mat[0][3] = 0.0f;
154
155 myOrientation.mat[1][0] = N[0];
156 myOrientation.mat[1][1] = N[1];
157 myOrientation.mat[1][2] = N[2];
158 myOrientation.mat[1][3] = 0.0f;
159
160 myOrientation.mat[2][0] = F[0];
161 myOrientation.mat[2][1] = F[1];
162 myOrientation.mat[2][2] = F[2];
163 myOrientation.mat[2][3] = 0.0f;
164
165 myOrientation.mat[3][0] = T[0];
166 myOrientation.mat[3][1] = T[1];
167 myOrientation.mat[3][2] = T[2];
168 myOrientation.mat[3][3] = 1.0f;
169
170 myEquationMod = myPlaneRoot->MCountEquation();
171}