0024192: Adding support for shaders to OCCT visualization toolkit
[occt.git] / src / OpenGl / OpenGl_AspectText.cxx
index 8c6f6c0..482a374 100644 (file)
-// 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();
+  }
+}