]> OCCT Git - occt.git/commitdiff
Add additional TypeOfAttribute for back vertex color
authormzernova <mzernova@opencascade.com>
Mon, 19 Aug 2024 11:27:38 +0000 (12:27 +0100)
committermzernova <mzernova@opencascade.com>
Mon, 3 Mar 2025 12:11:32 +0000 (12:11 +0000)
src/Graphic3d/Graphic3d_ArrayOfPrimitives.cxx
src/Graphic3d/Graphic3d_ArrayOfPrimitives.hxx
src/Graphic3d/Graphic3d_Buffer.hxx
src/Graphic3d/Graphic3d_ShaderManager.cxx
src/OpenGl/OpenGl_BackgroundArray.cxx
src/OpenGl/OpenGl_FrameStatsPrs.cxx
src/OpenGl/OpenGl_PrimitiveArray.cxx
src/OpenGl/OpenGl_ShaderProgram.cxx
src/OpenGl/OpenGl_VertexBuffer.cxx
src/Shaders/Declarations.glsl
src/Shaders/Shaders_Declarations_glsl.pxx

index c2497c98ad5dd94549df88092d523cb8547a8fef..0e546e1bffa08b27569fb6eb3ec51bba1eebc69c 100644 (file)
@@ -98,6 +98,7 @@ void Graphic3d_ArrayOfPrimitives::init (Graphic3d_TypeOfPrimitiveArray theType,
   myNormData = NULL;
   myTexData  = NULL;
   myColData  = NULL;
+  myColDataBack = NULL;
   myAttribs.Nullify();
   myIndices.Nullify();
   myBounds.Nullify();
@@ -171,6 +172,10 @@ void Graphic3d_ArrayOfPrimitives::init (Graphic3d_TypeOfPrimitiveArray theType,
     anAttribs[aNbAttribs].Id       = Graphic3d_TOA_COLOR;
     anAttribs[aNbAttribs].DataType = Graphic3d_TOD_VEC4UB;
     ++aNbAttribs;
+
+    anAttribs[aNbAttribs].Id = Graphic3d_TOA_COLOR_BACK;
+    anAttribs[aNbAttribs].DataType = Graphic3d_TOD_VEC4UB;
+    ++aNbAttribs;
   }
 
   if (!myAttribs->Init (theMaxVertexs, anAttribs, aNbAttribs))
@@ -185,6 +190,7 @@ void Graphic3d_ArrayOfPrimitives::init (Graphic3d_TypeOfPrimitiveArray theType,
   myNormData = myAttribs->ChangeAttributeData (Graphic3d_TOA_NORM,  anAttribDummy, myNormStride);
   myTexData  = myAttribs->ChangeAttributeData (Graphic3d_TOA_UV,    anAttribDummy, myTexStride);
   myColData  = myAttribs->ChangeAttributeData (Graphic3d_TOA_COLOR, anAttribDummy, myColStride);
+  myColDataBack = myAttribs->ChangeAttributeData (Graphic3d_TOA_COLOR_BACK, anAttribDummy, myColStrideBack);
 
   memset (myAttribs->ChangeData(), 0, size_t(myAttribs->Stride) * size_t(myAttribs->NbMaxElements()));
   if ((theArrayOptions & Graphic3d_ArrayFlags_AttribsMutable) == 0
index 4d1daa5e4908e681f699cce1b23f8cdc724b6d98..d402d5ca9927a954a3150681fdf04a64a42f87f9 100644 (file)
@@ -806,7 +806,7 @@ protected: //! @name protected constructors
                                Standard_Integer theMaxBounds,
                                Standard_Integer theMaxEdges,
                                Graphic3d_ArrayFlags theArrayFlags)
-  : myNormData (NULL), myTexData (NULL), myColData (NULL), myPosStride (0), myNormStride (0), myTexStride (0), myColStride (0),
+  : myNormData (NULL), myTexData (NULL), myColData (NULL), myColDataBack (NULL), myPosStride (0), myNormStride (0), myTexStride (0), myColStride (0),
     myType (Graphic3d_TOPA_UNDEFINED)
   {
     init (theType, theMaxVertexs, theMaxBounds, theMaxEdges, theArrayFlags);
@@ -827,10 +827,12 @@ private: //! @name private fields
   Standard_Byte* myNormData;
   Standard_Byte* myTexData;
   Standard_Byte* myColData;
+  Standard_Byte* myColDataBack;
   Standard_Size  myPosStride;
   Standard_Size  myNormStride;
   Standard_Size  myTexStride;
   Standard_Size  myColStride;
+  Standard_Size  myColStrideBack;
   Graphic3d_TypeOfPrimitiveArray myType;
 
 };
index 8b841920384b51de8371ab7195fe10487e8f8fe8..27409749e73c715f3a194aebb7db21743814a134 100644 (file)
@@ -27,6 +27,7 @@ enum Graphic3d_TypeOfAttribute
   Graphic3d_TOA_NORM,         //!< normal
   Graphic3d_TOA_UV,           //!< texture coordinates
   Graphic3d_TOA_COLOR,        //!< per-vertex color
+  Graphic3d_TOA_COLOR_BACK,   //!< per-vertex color back
   Graphic3d_TOA_CUSTOM,       //!< custom attributes
 };
 
index 8650a554dfcd70ed46e2d24dda5a1562a3ae9cf7..0a3f778e898736de70fc4e6b1a07b5e4ed8ac524 100644 (file)
@@ -1019,8 +1019,10 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramUnlit (Sta
   if ((theBits & Graphic3d_ShaderFlags_VertColor) != 0)
   {
     aStageInOuts.Append (Graphic3d_ShaderObject::ShaderVariable ("vec4 VertColor", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT));
+    aStageInOuts.Append (Graphic3d_ShaderObject::ShaderVariable ("vec4 VertColorBack", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT));
     aSrcVertExtraMain += EOL"  VertColor = occVertColor;";
-    aSrcFragGetColor  =  EOL"vec4 getColor(void) { return VertColor; }";
+    aSrcVertExtraMain += EOL"  VertColorBack = occVertColorBack;";
+    aSrcFragGetColor  =  EOL"vec4 getColor(void) { return gl_FrontFacing ? VertColor : VertColorBack; }";
   }
 
   int aNbClipPlanes = 0;
@@ -1430,7 +1432,7 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramGouraud (c
 
   if ((theBits & Graphic3d_ShaderFlags_VertColor) != 0)
   {
-    aSrcVertColor = EOL"vec4 getVertColor(void) { return occVertColor; }";
+    aSrcVertColor = EOL"vec4 getVertColor(void) { return gl_FrontFacing ? VertColor : VertColorBack; }";
   }
 
   int aNbClipPlanes = 0;
@@ -1617,8 +1619,10 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramPhong (con
   if ((theBits & Graphic3d_ShaderFlags_VertColor) != 0)
   {
     aStageInOuts.Append (Graphic3d_ShaderObject::ShaderVariable ("vec4 VertColor", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT));
+    aStageInOuts.Append (Graphic3d_ShaderObject::ShaderVariable ("vec4 VertColorBack", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT));
     aSrcVertExtraMain   += EOL"  VertColor = occVertColor;";
-    aSrcFragGetVertColor = EOL"vec4 getVertColor(void) { return VertColor; }";
+    aSrcVertExtraMain   += EOL"  VertColorBack = occVertColorBack;";
+    aSrcFragGetVertColor = EOL"vec4 getVertColor(void) { return gl_FrontFacing ? VertColor : VertColorBack; }";
   }
 
   int aNbClipPlanes = 0;
index b005bf285e1515360337f6ecbe2e687c6316c913..4d85799e0ed58c606f62a70a020a3bac5daf9ada 100644 (file)
@@ -201,7 +201,8 @@ Standard_Boolean OpenGl_BackgroundArray::createGradientArray (const Handle(OpenG
   Graphic3d_Attribute aGragientAttribInfo[] =
   {
     { Graphic3d_TOA_POS,   Graphic3d_TOD_VEC2 },
-    { Graphic3d_TOA_COLOR, Graphic3d_TOD_VEC3 }
+    { Graphic3d_TOA_COLOR, Graphic3d_TOD_VEC3 },
+    { Graphic3d_TOA_COLOR_BACK, Graphic3d_TOD_VEC3 }
   };
 
   if (!myAttribs->Init (4, aGragientAttribInfo, 2))
index 8213867c6631aa79d2b7d2e04b2982682416a4fe..93f111c7861958d62326baa77400b5ca12555611 100644 (file)
@@ -427,11 +427,13 @@ void OpenGl_FrameStatsPrs::Render (const Handle(OpenGl_Workspace)& theWorkspace)
     myChartVertices->Bind (aCtx);
     myChartVertices->bindAttribute (aCtx, Graphic3d_TOA_POS,   3, GL_FLOAT,         myChartVertices->GetComponentsNb(), NULL);
     myChartVertices->bindAttribute (aCtx, Graphic3d_TOA_COLOR, 4, GL_UNSIGNED_BYTE, myChartVertices->GetComponentsNb(), (void* )sizeof(Graphic3d_Vec3));
+    myChartVertices->bindAttribute (aCtx, Graphic3d_TOA_COLOR_BACK, 5, GL_UNSIGNED_BYTE, myChartVertices->GetComponentsNb(), (void*)sizeof(Graphic3d_Vec3));
 
     myChartIndices->Bind (aCtx);
     aCtx->core15fwd->glDrawElements (GL_TRIANGLES, myChartIndices->GetElemsNb(), myChartIndices->GetDataType(), NULL);
     myChartIndices->Unbind (aCtx);
     myChartVertices->Unbind (aCtx);
+    myChartVertices->unbindAttribute (aCtx, Graphic3d_TOA_COLOR_BACK);
     myChartVertices->unbindAttribute (aCtx, Graphic3d_TOA_COLOR);
     myChartVertices->unbindAttribute (aCtx, Graphic3d_TOA_POS);
     aCtx->core15fwd->glDisable (GL_BLEND);
@@ -439,8 +441,10 @@ void OpenGl_FrameStatsPrs::Render (const Handle(OpenGl_Workspace)& theWorkspace)
     myChartLines->Bind (aCtx);
     myChartLines->bindAttribute (aCtx, Graphic3d_TOA_POS,   3, GL_FLOAT,         myChartLines->GetComponentsNb(), NULL);
     myChartLines->bindAttribute (aCtx, Graphic3d_TOA_COLOR, 4, GL_UNSIGNED_BYTE, myChartLines->GetComponentsNb(), (void* )sizeof(Graphic3d_Vec3));
+    myChartLines->bindAttribute (aCtx, Graphic3d_TOA_COLOR_BACK, 5, GL_UNSIGNED_BYTE, myChartLines->GetComponentsNb(), (void*)sizeof(Graphic3d_Vec3));
     aCtx->core15fwd->glDrawArrays (GL_LINES, 0, myChartLines->GetElemsNb());
     myChartLines->Unbind (aCtx);
+    myChartLines->unbindAttribute (aCtx, Graphic3d_TOA_COLOR_BACK);
     myChartLines->unbindAttribute (aCtx, Graphic3d_TOA_COLOR);
     myChartLines->unbindAttribute (aCtx, Graphic3d_TOA_POS);
 
index 151d1cc40aa45a202b6386a1a41ac3202e354ca9..6ea79e1052a5d9008f82f2d31b38f92fd3b7c83e 100644 (file)
@@ -432,6 +432,7 @@ void OpenGl_PrimitiveArray::drawArray (const Handle(OpenGl_Workspace)& theWorksp
   {
     // disable per-vertex color
     OpenGl_VertexBuffer::unbindAttribute (aGlContext, Graphic3d_TOA_COLOR);
+    OpenGl_VertexBuffer::unbindAttribute (aGlContext, Graphic3d_TOA_COLOR_BACK);
   }
   if (!myVboIndices.IsNull())
   {
index a5504af8aff720b08ad00e5fc84cd0cc5b42036c..6985560e81599c15403a3e66507454dbd191a8b8 100755 (executable)
@@ -510,6 +510,7 @@ Standard_Boolean OpenGl_ShaderProgram::Initialize (const Handle(OpenGl_Context)&
   SetAttributeName (theCtx, Graphic3d_TOA_NORM,  "occNormal");
   SetAttributeName (theCtx, Graphic3d_TOA_UV,    "occTexCoord");
   SetAttributeName (theCtx, Graphic3d_TOA_COLOR, "occVertColor");
+  SetAttributeName (theCtx, Graphic3d_TOA_COLOR_BACK, "occVertColorBack");
 
   // bind custom Vertex Attributes
   if (!myProxy.IsNull())
index 471e8be611e19006c3341c91de95792fb56449f4..c46ce0d1076ecabe7526dd6aab737ae4a073fb0e 100644 (file)
@@ -205,7 +205,15 @@ void OpenGl_VertexBuffer::bindFixed (const Handle(OpenGl_Context)&   theCtx,
     {
       theCtx->core11ffp->glEnableClientState (GL_COLOR_ARRAY);
       theCtx->core11ffp->glColorPointer (theNbComp, theDataType, theStride, theOffset);
-      theCtx->core11ffp->glColorMaterial (GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
+      theCtx->core11ffp->glColorMaterial (GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
+      theCtx->core11fwd->glEnable (GL_COLOR_MATERIAL);
+      return;
+    }
+    case Graphic3d_TOA_COLOR_BACK:
+    {
+      theCtx->core11ffp->glEnableClientState (GL_COLOR_ARRAY);
+      theCtx->core11ffp->glColorPointer (theNbComp, theDataType, theStride, theOffset);
+      theCtx->core11ffp->glColorMaterial (GL_BACK, GL_AMBIENT_AND_DIFFUSE);
       theCtx->core11fwd->glEnable (GL_COLOR_MATERIAL);
       return;
     }
@@ -229,6 +237,7 @@ void OpenGl_VertexBuffer::unbindFixed (const Handle(OpenGl_Context)&   theCtx,
     case Graphic3d_TOA_NORM:  theCtx->core11ffp->glDisableClientState (GL_NORMAL_ARRAY);        return;
     case Graphic3d_TOA_UV:    theCtx->core11ffp->glDisableClientState (GL_TEXTURE_COORD_ARRAY); return;
     case Graphic3d_TOA_COLOR: unbindFixedColor (theCtx); return;
+    case Graphic3d_TOA_COLOR_BACK:
     case Graphic3d_TOA_CUSTOM:
     {
       return;
index ea4bc6ca151a058d510a7f7608391e4776841e01..972b592bb588166666d30a84577bb36d07435db4 100644 (file)
@@ -55,6 +55,7 @@
   THE_ATTRIBUTE vec3 occNormal;
   THE_ATTRIBUTE vec4 occTexCoord;
   THE_ATTRIBUTE vec4 occVertColor;
+  THE_ATTRIBUTE vec4 occVertColorBack;
 #elif defined(FRAGMENT_SHADER)
   #if (__VERSION__ >= 130)
     #ifdef OCC_ENABLE_draw_buffers
index 0485a491c67c7e65317e355e9245f3e6792d00fb..e937b2de30f7bd639576d521556bce37fbd7e6c6 100644 (file)
@@ -58,6 +58,7 @@ static const char Shaders_Declarations_glsl[] =
   "  THE_ATTRIBUTE vec3 occNormal;\n"
   "  THE_ATTRIBUTE vec4 occTexCoord;\n"
   "  THE_ATTRIBUTE vec4 occVertColor;\n"
+  "  THE_ATTRIBUTE vec4 occVertColorBack;\n"
   "#elif defined(FRAGMENT_SHADER)\n"
   "  #if (__VERSION__ >= 130)\n"
   "    #ifdef OCC_ENABLE_draw_buffers\n"