-// File: OpenGl_AspectText.cxx
-// Created: 13 July 2011
-// Author: Sergey ZERCHANINOV
-// Copyright: OPEN CASCADE 2011
+// Created on: 2011-07-13
+// Created by: Sergey ZERCHANINOV
+// Copyright (c) 2011-2013 OPEN CASCADE SAS
+//
+// The content of this file is subject to the Open CASCADE Technology Public
+// License Version 6.5 (the "License"). You may not use the content of this file
+// except in compliance with the License. Please obtain a copy of the License
+// at http://www.opencascade.org and read it completely before using this file.
+//
+// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
+// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+//
+// The Original Code and all software distributed under the License is
+// distributed on an "AS IS" basis, without warranty of any kind, and the
+// Initial Developer hereby disclaims all such warranties, including without
+// limitation, any warranties of merchantability, fitness for a particular
+// purpose or non-infringement. Please see the License for the specific terms
+// and conditions governing the rights and limitations under the License.
+
+#include <Graphic3d_ShaderProgram.hxx>
#include <OpenGl_AspectText.hxx>
+#include <OpenGl_Context.hxx>
+#include <OpenGl_Workspace.hxx>
+#include <OpenGl_ShaderManager.hxx>
+#include <OpenGl_ShaderProgram.hxx>
-static const TEL_COLOUR myDefaultColor = {{ 1.0F, 1.0F, 1.0F, 1.0F }};
-
-/*----------------------------------------------------------------------*/
-
-OpenGl_AspectText::OpenGl_AspectText ()
- : myZoomable(0),
- myAngle(0.0F),
- myFontAspect(OSD_FA_Regular),
- myFont(NULL),
- //mySpace(0.3F),
- //myExpan(1.0F),
- myColor(myDefaultColor),
- myStyleType(Aspect_TOST_NORMAL),
- myDisplayType(Aspect_TODT_NORMAL),
- mySubtitleColor(myDefaultColor)
+namespace
{
- SetFontName( (const char *) "Courier" );
-}
-
-/*----------------------------------------------------------------------*/
+ static const TEL_COLOUR TheDefaultColor = {{ 1.0F, 1.0F, 1.0F, 1.0F }};
+ static const TCollection_AsciiString THE_EMPTY_KEY;
+};
-OpenGl_AspectText::~OpenGl_AspectText ()
+// =======================================================================
+// function : OpenGl_AspectText
+// purpose :
+// =======================================================================
+OpenGl_AspectText::OpenGl_AspectText()
+: myFont ("Courier") ,
+ myColor (TheDefaultColor),
+ mySubtitleColor (TheDefaultColor),
+ myAngle (0.0f),
+ myStyleType (Aspect_TOST_NORMAL),
+ myDisplayType (Aspect_TODT_NORMAL),
+ myFontAspect (Font_FA_Regular),
+ myZoomable (false),
+ myShaderProgram()
{
- if (myFont)
- delete[] myFont;
+ //
}
-/*----------------------------------------------------------------------*/
+// =======================================================================
+// function : ~OpenGl_AspectText
+// purpose :
+// =======================================================================
+OpenGl_AspectText::~OpenGl_AspectText()
+{
+ //
+}
-void OpenGl_AspectText::SetContext (const CALL_DEF_CONTEXTTEXT &AContext)
+// =======================================================================
+// function : SetAspect
+// purpose :
+// =======================================================================
+void OpenGl_AspectText::SetAspect (const CALL_DEF_CONTEXTTEXT& theAspect)
{
- myZoomable = (int) AContext.TextZoomable;
- myAngle = (float) AContext.TextAngle;
- myFontAspect = (OSD_FontAspect) AContext.TextFontAspect;
- //mySpace = (float) AContext.Space;
- //myExpan = (float) AContext.Expan;
- myColor.rgb[0] = (float) AContext.Color.r;
- myColor.rgb[1] = (float) AContext.Color.g;
- myColor.rgb[2] = (float) AContext.Color.b;
+ myFont = theAspect.Font;
+
+ myColor.rgb[0] = (float )theAspect.Color.r;
+ myColor.rgb[1] = (float )theAspect.Color.g;
+ myColor.rgb[2] = (float )theAspect.Color.b;
myColor.rgb[3] = 1.0f;
- myStyleType = (Aspect_TypeOfStyleText) AContext.Style;
- myDisplayType = (Aspect_TypeOfDisplayText) AContext.DisplayType;
- mySubtitleColor.rgb[0] = (float) AContext.ColorSubTitle.r;
- mySubtitleColor.rgb[1] = (float) AContext.ColorSubTitle.g;
- mySubtitleColor.rgb[2] = (float) AContext.ColorSubTitle.b;
+ mySubtitleColor.rgb[0] = (float )theAspect.ColorSubTitle.r;
+ mySubtitleColor.rgb[1] = (float )theAspect.ColorSubTitle.g;
+ mySubtitleColor.rgb[2] = (float )theAspect.ColorSubTitle.b;
mySubtitleColor.rgb[3] = 1.0f;
- SetFontName( (const char *) AContext.Font );
-}
+ myAngle = (float )theAspect.TextAngle;
+ myStyleType = (Aspect_TypeOfStyleText )theAspect.Style;
+ myDisplayType = (Aspect_TypeOfDisplayText )theAspect.DisplayType;
+ myFontAspect = (Font_FontAspect )theAspect.TextFontAspect;
+ myZoomable = (theAspect.TextZoomable != 0);
-/*----------------------------------------------------------------------*/
+ // update resource bindings
+ myShaderProgram = theAspect.ShaderProgram;
-void OpenGl_AspectText::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
-{
- AWorkspace->SetAspectText(this);
+ const TCollection_AsciiString& aShaderKey = myShaderProgram.IsNull() ? THE_EMPTY_KEY : myShaderProgram->GetId();
+
+ if (aShaderKey.IsEmpty() || myResources.ShaderProgramId != aShaderKey)
+ {
+ myResources.ResetShader();
+ }
}
-/*----------------------------------------------------------------------*/
+// =======================================================================
+// function : Render
+// purpose :
+// =======================================================================
+void OpenGl_AspectText::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
+{
+ theWorkspace->SetAspectText (this);
+}
-void OpenGl_AspectText::SetFontName (const char *AFont)
+// =======================================================================
+// function : Release
+// purpose :
+// =======================================================================
+void OpenGl_AspectText::Release (const Handle(OpenGl_Context)& theContext)
{
- if (myFont)
- delete[] myFont;
- char *fontname = new char[ strlen( AFont ) + 1 ];
- strcpy( fontname, AFont );
- myFont = fontname;
+ if (!myResources.ShaderProgram.IsNull() && !theContext.IsNull())
+ {
+ theContext->ShaderManager()->Unregister (myResources.ShaderProgram);
+ }
+ myResources.ShaderProgramId.Clear();
+ myResources.ResetShader();
}
-/*----------------------------------------------------------------------*/
+// =======================================================================
+// function : BuildShader
+// purpose :
+// =======================================================================
+void OpenGl_AspectText::Resources::BuildShader (const Handle(OpenGl_Workspace)& theWS,
+ const Handle(Graphic3d_ShaderProgram)& theShader)
+{
+ const Handle(OpenGl_Context)& aContext = theWS->GetGlContext();
+
+ if (!aContext->IsGlGreaterEqual (2, 0))
+ return;
+
+ // release old shader program resources
+ if (!ShaderProgram.IsNull())
+ {
+ aContext->ShaderManager()->Unregister (ShaderProgram);
+ }
+
+ ShaderProgramId = theShader.IsNull() ? THE_EMPTY_KEY : theShader->GetId();
+
+ if (!theShader.IsNull())
+ {
+ if (!aContext->GetResource<Handle(OpenGl_ShaderProgram)> (ShaderProgramId, ShaderProgram))
+ {
+ ShaderProgram = aContext->ShaderManager()->Create (theShader);
+ if (!ShaderProgramId.IsEmpty())
+ {
+ aContext->ShareResource (ShaderProgramId, ShaderProgram);
+ }
+ }
+ }
+ else
+ {
+ ShaderProgram.Nullify();
+ }
+}