myNormData = NULL;
myTexData = NULL;
myColData = NULL;
+ myColDataBack = NULL;
myAttribs.Nullify();
myIndices.Nullify();
myBounds.Nullify();
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))
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
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);
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;
};
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
};
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;
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;
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;
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))
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);
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);
{
// disable per-vertex color
OpenGl_VertexBuffer::unbindAttribute (aGlContext, Graphic3d_TOA_COLOR);
+ OpenGl_VertexBuffer::unbindAttribute (aGlContext, Graphic3d_TOA_COLOR_BACK);
}
if (!myVboIndices.IsNull())
{
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())
{
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;
}
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;
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
" 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"