1 // Created on: 2013-08-15
2 // Created by: Anton POLETAEV
3 // Copyright (c) 2013-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <OpenGl_CappingPlaneResource.hxx>
18 #include <OpenGl_Context.hxx>
19 #include <OpenGl_Vec.hxx>
20 #include <OpenGl_ShaderManager.hxx>
21 #include <Precision.hxx>
23 IMPLEMENT_STANDARD_RTTIEXT(OpenGl_CappingPlaneResource,OpenGl_Resource)
27 //! 12 plane vertices, interleaved:
28 //! - 4 floats, position
29 //! - 4 floats, normal
30 //! - 4 floats, UV texture coordinates
31 static const GLfloat THE_CAPPING_PLN_VERTS[12 * (4 + 4 + 4)] =
33 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
34 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,
35 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
37 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
38 -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
39 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,
41 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
42 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
43 -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
45 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
46 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
47 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f
51 // =======================================================================
52 // function : OpenGl_CappingPlaneResource
54 // =======================================================================
55 OpenGl_CappingPlaneResource::OpenGl_CappingPlaneResource (const Handle(Graphic3d_ClipPlane)& thePlane)
56 : myPrimitives (NULL),
57 myOrientation (OpenGl_Mat4::Identity()),
59 myPlaneRoot (thePlane),
60 myEquationMod ((unsigned int )-1),
61 myAspectMod ((unsigned int )-1)
63 Handle(Graphic3d_Buffer) anAttribs = new Graphic3d_Buffer (Graphic3d_Buffer::DefaultAllocator());
64 Graphic3d_Attribute anAttribInfo[] =
66 { Graphic3d_TOA_POS, Graphic3d_TOD_VEC4 },
67 { Graphic3d_TOA_NORM, Graphic3d_TOD_VEC4 },
68 { Graphic3d_TOA_UV, Graphic3d_TOD_VEC4 }
70 if (anAttribs->Init (12, anAttribInfo, 3))
72 memcpy (anAttribs->ChangeData(), THE_CAPPING_PLN_VERTS, sizeof(THE_CAPPING_PLN_VERTS));
73 myPrimitives.InitBuffers (NULL, Graphic3d_TOPA_TRIANGLES, NULL, anAttribs, NULL);
77 // =======================================================================
78 // function : OpenGl_CappingPlaneResource
80 // =======================================================================
81 OpenGl_CappingPlaneResource::~OpenGl_CappingPlaneResource()
86 // =======================================================================
89 // =======================================================================
90 void OpenGl_CappingPlaneResource::Update (const Handle(OpenGl_Context)& theCtx,
91 const Handle(Graphic3d_Aspects)& theObjAspect)
93 updateTransform (theCtx);
94 updateAspect (theObjAspect);
97 // =======================================================================
100 // =======================================================================
101 void OpenGl_CappingPlaneResource::Release (OpenGl_Context* theContext)
103 OpenGl_Element::Destroy (theContext, myAspect);
104 myPrimitives.Release (theContext);
105 myEquationMod = (unsigned int )-1;
106 myAspectMod = (unsigned int )-1;
109 // =======================================================================
110 // function : updateAspect
112 // =======================================================================
113 void OpenGl_CappingPlaneResource::updateAspect (const Handle(Graphic3d_Aspects)& theObjAspect)
115 if (myAspect == NULL)
117 myAspect = new OpenGl_Aspects();
118 myAspectMod = myPlaneRoot->MCountAspect() - 1; // mark out of sync
121 if (theObjAspect.IsNull())
123 if (myAspectMod != myPlaneRoot->MCountAspect())
125 myAspect->SetAspect (myPlaneRoot->CappingAspect());
126 myAspectMod = myPlaneRoot->MCountAspect();
131 if (myFillAreaAspect.IsNull())
133 myFillAreaAspect = new Graphic3d_AspectFillArea3d();
135 if (myAspectMod != myPlaneRoot->MCountAspect())
137 *myFillAreaAspect = *myPlaneRoot->CappingAspect();
140 if (myPlaneRoot->ToUseObjectMaterial())
142 // only front material currently supported by capping rendering
143 myFillAreaAspect->SetFrontMaterial (theObjAspect->FrontMaterial());
144 myFillAreaAspect->SetInteriorColor (theObjAspect->InteriorColor());
146 if (myPlaneRoot->ToUseObjectTexture())
148 myFillAreaAspect->SetTextureSet (theObjAspect->TextureSet());
149 if (theObjAspect->ToMapTexture())
151 myFillAreaAspect->SetTextureMapOn();
155 myFillAreaAspect->SetTextureMapOff();
158 if (myPlaneRoot->ToUseObjectShader())
160 myFillAreaAspect->SetShaderProgram (theObjAspect->ShaderProgram());
163 myAspect->SetAspect (myFillAreaAspect);
166 // =======================================================================
167 // function : updateTransform
169 // =======================================================================
170 void OpenGl_CappingPlaneResource::updateTransform (const Handle(OpenGl_Context)& theCtx)
172 if (myEquationMod == myPlaneRoot->MCountEquation()
173 && myLocalOrigin.IsEqual (theCtx->ShaderManager()->LocalOrigin(), gp::Resolution()))
175 return; // nothing to update
178 myEquationMod = myPlaneRoot->MCountEquation();
179 myLocalOrigin = theCtx->ShaderManager()->LocalOrigin();
181 const Graphic3d_ClipPlane::Equation& anEq = myPlaneRoot->GetEquation();
182 const Standard_Real anEqW = theCtx->ShaderManager()->LocalClippingPlaneW (*myPlaneRoot);
184 // re-evaluate infinite plane transformation matrix
185 const Graphic3d_Vec3 aNorm (anEq.xyz());
186 const Graphic3d_Vec3 T (anEq.xyz() * -anEqW);
188 // project plane normal onto OX to find left vector
189 const Standard_ShortReal aProjLen = sqrt ((Standard_ShortReal)anEq.xz().SquareModulus());
190 Graphic3d_Vec3 aLeft;
191 if (aProjLen < ShortRealSmall())
197 aLeft[0] = aNorm[2] / aProjLen;
198 aLeft[2] = -aNorm[0] / aProjLen;
201 const Graphic3d_Vec3 F = Graphic3d_Vec3::Cross (-aLeft, aNorm);
202 myOrientation.SetColumn (0, aLeft);
203 myOrientation.SetColumn (1, aNorm);
204 myOrientation.SetColumn (2, F);
205 myOrientation.SetColumn (3, T);