#define EOL "\n"
+//! Definition of VertColor varying.
+const char THE_VARY_VertColor[] =
+ EOL"varying vec4 VertColor;";
+
+const char THE_VARY_TexCoord[] =
+ EOL"varying vec2 TexCoord;";
+
//! Auxiliary function to transform normal
const char THE_FUNC_transformNormal[] =
EOL"vec3 transformNormal (in vec3 theNormal)"
myWorldViewState.Update();
}
-// =======================================================================
-// function : RevertProjectionStateTo
-// purpose : Reverts state of OCCT projection transform
-// =======================================================================
-void OpenGl_ShaderManager::RevertProjectionStateTo (const OpenGl_Mat4& theProjectionMatrix)
-{
- myProjectionState.Set (theProjectionMatrix);
- myProjectionState.Revert();
-}
-
-// =======================================================================
-// function : RevertModelWorldStateTo
-// purpose : Reverts state of OCCT model-world transform
-// =======================================================================
-void OpenGl_ShaderManager::RevertModelWorldStateTo (const OpenGl_Mat4& theModelWorldMatrix)
-{
- myModelWorldState.Set (theModelWorldMatrix);
- myModelWorldState.Revert();
-}
-
-// =======================================================================
-// function : RevertWorldViewStateTo
-// purpose : Reverts state of OCCT world-view transform
-// =======================================================================
-void OpenGl_ShaderManager::RevertWorldViewStateTo (const OpenGl_Mat4& theWorldViewMatrix)
-{
- myWorldViewState.Set (theWorldViewMatrix);
- myWorldViewState.Revert();
-}
-
// =======================================================================
// function : LightSourceState
// purpose : Returns current state of OCCT light sources
EOL" gl_FragColor = aColor;";
}
}
+ else
+ {
+ if ((theBits & OpenGl_PO_TextureRGB) != 0)
+ {
+ aSrcVertExtraOut += THE_VARY_TexCoord;
+ aSrcFragExtraOut += THE_VARY_TexCoord;
+ aSrcVertExtraMain +=
+ EOL" TexCoord = occTexCoord.st;";
+
+ aSrcFragGetColor =
+ EOL"vec4 getColor(void) { return texture2D(occActiveSampler, TexCoord.st); }";
+ }
+ }
if ((theBits & OpenGl_PO_VertColor) != 0)
{
- aSrcVertExtraOut += EOL"varying vec4 VertColor;";
+ aSrcVertExtraOut += THE_VARY_VertColor;
aSrcVertExtraMain += EOL" VertColor = occVertColor;";
- aSrcFragExtraOut += EOL"varying vec4 VertColor;";
+ aSrcFragExtraOut += THE_VARY_VertColor;
aSrcFragGetColor = EOL"vec4 getColor(void) { return VertColor; }";
}
if ((theBits & OpenGl_PO_ClipPlanes) != 0)
// function : stdComputeLighting
// purpose :
// =======================================================================
-TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting()
+TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (const Standard_Boolean theHasVertColor)
{
bool aLightsMap[Visual3d_TOLS_SPOT + 1] = { false, false, false, false };
TCollection_AsciiString aLightsFunc, aLightsLoop;
}
}
+ TCollection_AsciiString aGetMatAmbient = "theIsFront ? occFrontMaterial_Ambient() : occBackMaterial_Ambient();";
+ TCollection_AsciiString aGetMatDiffuse = "theIsFront ? occFrontMaterial_Diffuse() : occBackMaterial_Diffuse();";
+ if (theHasVertColor)
+ {
+ aGetMatAmbient = "getVertColor();";
+ aGetMatDiffuse = "getVertColor();";
+ }
+
return TCollection_AsciiString()
+ THE_FUNC_lightDef
+ aLightsFunc
EOL" Specular = vec3 (0.0);"
EOL" vec3 aPoint = thePoint.xyz / thePoint.w;"
+ aLightsLoop
- + EOL" vec4 aMaterialAmbient = theIsFront ? occFrontMaterial_Ambient() : occBackMaterial_Ambient();"
- EOL" vec4 aMaterialDiffuse = theIsFront ? occFrontMaterial_Diffuse() : occBackMaterial_Diffuse();"
- EOL" vec4 aMaterialSpecular = theIsFront ? occFrontMaterial_Specular() : occBackMaterial_Specular();"
+ + EOL" vec4 aMaterialAmbient = " + aGetMatAmbient
+ + EOL" vec4 aMaterialDiffuse = " + aGetMatDiffuse
+ + EOL" vec4 aMaterialSpecular = theIsFront ? occFrontMaterial_Specular() : occBackMaterial_Specular();"
EOL" vec4 aMaterialEmission = theIsFront ? occFrontMaterial_Emission() : occBackMaterial_Emission();"
EOL" return vec4 (Ambient, 1.0) * aMaterialAmbient"
EOL" + vec4 (Diffuse, 1.0) * aMaterialDiffuse"
const Standard_Integer theBits)
{
Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram();
- TCollection_AsciiString aSrcVert, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraOut, aSrcFragExtraMain;
+ TCollection_AsciiString aSrcVert, aSrcVertColor, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraOut, aSrcFragExtraMain;
+ TCollection_AsciiString aSrcFragGetColor = EOL"vec4 getColor(void) { return gl_FrontFacing ? FrontColor : BackColor; }";
if ((theBits & OpenGl_PO_Point) != 0)
{
#if defined(GL_ES_VERSION_2_0)
aSrcVertExtraMain += EOL" gl_PointSize = occPointSize;";
#endif
}
+ if ((theBits & OpenGl_PO_VertColor) != 0)
+ {
+ aSrcVertColor = EOL"vec4 getVertColor(void) { return occVertColor; }";
+ }
+ if ((theBits & OpenGl_PO_Point) != 0)
+ {
+ if ((theBits & OpenGl_PO_TextureRGB) != 0)
+ {
+ aSrcFragGetColor =
+ EOL"vec4 getColor(void)"
+ EOL"{"
+ EOL" vec4 aColor = gl_FrontFacing ? FrontColor : BackColor;"
+ EOL" return texture2D(occActiveSampler, gl_PointCoord) * aColor;"
+ EOL"}";
+ }
+ }
+ else
+ {
+ if ((theBits & OpenGl_PO_TextureRGB) != 0)
+ {
+ aSrcVertExtraOut += THE_VARY_TexCoord;
+ aSrcFragExtraOut += THE_VARY_TexCoord;
+ aSrcVertExtraMain +=
+ EOL" TexCoord = occTexCoord.st;";
+
+ aSrcFragGetColor =
+ EOL"vec4 getColor(void)"
+ EOL"{"
+ EOL" vec4 aColor = gl_FrontFacing ? FrontColor : BackColor;"
+ EOL" return texture2D(occActiveSampler, TexCoord.st) * aColor;"
+ EOL"}";
+ }
+ }
if ((theBits & OpenGl_PO_ClipPlanes) != 0)
{
const char THE_POS_VARY[] =
aSrcFragExtraMain += THE_FRAG_CLIP_PLANES;
}
- const TCollection_AsciiString aLights = stdComputeLighting();
+ const TCollection_AsciiString aLights = stdComputeLighting ((theBits & OpenGl_PO_VertColor) != 0);
aSrcVert = TCollection_AsciiString()
+ THE_FUNC_transformNormal
+ EOL
+ + aSrcVertColor
+ aLights
+ EOL
EOL"varying vec4 FrontColor;"
+ EOL"varying vec4 FrontColor;"
EOL"varying vec4 BackColor;"
+ aSrcFragExtraOut
+ + aSrcFragGetColor
+ EOL"void main()"
EOL"{"
+ aSrcFragExtraMain
- + EOL" gl_FragColor = gl_FrontFacing ? FrontColor : BackColor;"
+ + EOL" gl_FragColor = getColor();"
EOL"}";
aProgramSrc->AttachShader (Graphic3d_ShaderObject::CreateFromSource (Graphic3d_TOS_VERTEX, aSrcVert));
Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_ShaderProgram)& theProgram,
const Standard_Integer theBits)
{
+ #define thePhongCompLight "computeLighting (normalize (Normal), normalize (View), Position, gl_FrontFacing)"
+
Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram();
- TCollection_AsciiString aSrcVert, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraMain;
+ TCollection_AsciiString aSrcVert, aSrcVertExtraOut, aSrcVertExtraMain, aSrcFrag, aSrcFragExtraOut, aSrcFragGetVertColor, aSrcFragExtraMain;
+ TCollection_AsciiString aSrcFragGetColor = EOL"vec4 getColor(void) { return " thePhongCompLight "; }";
if ((theBits & OpenGl_PO_Point) != 0)
{
#if defined(GL_ES_VERSION_2_0)
aSrcVertExtraMain += EOL" gl_PointSize = occPointSize;";
#endif
}
+ if ((theBits & OpenGl_PO_VertColor) != 0)
+ {
+ aSrcVertExtraOut += THE_VARY_VertColor;
+ aSrcVertExtraMain += EOL" VertColor = occVertColor;";
+ aSrcFragGetColor = EOL"varying vec4 VertColor;"
+ EOL"vec4 getVertColor(void) { return VertColor; }";
+ }
+
+ if ((theBits & OpenGl_PO_Point) != 0)
+ {
+ if ((theBits & OpenGl_PO_TextureRGB) != 0)
+ {
+ aSrcFragGetColor =
+ EOL"vec4 getColor(void)"
+ EOL"{"
+ EOL" vec4 aColor = " thePhongCompLight ";"
+ EOL" return texture2D(occActiveSampler, gl_PointCoord) * aColor;"
+ EOL"}";
+ }
+ }
+ else
+ {
+ if ((theBits & OpenGl_PO_TextureRGB) != 0)
+ {
+ aSrcVertExtraOut += THE_VARY_TexCoord;
+ aSrcFragExtraOut += THE_VARY_TexCoord;
+ aSrcVertExtraMain +=
+ EOL" TexCoord = occTexCoord.st;";
+
+ aSrcFragGetColor =
+ EOL"vec4 getColor(void)"
+ EOL"{"
+ EOL" vec4 aColor = " thePhongCompLight ";"
+ EOL" return texture2D(occActiveSampler, TexCoord.st) * aColor;"
+ EOL"}";
+ }
+ }
+
if ((theBits & OpenGl_PO_ClipPlanes) != 0)
{
aSrcFragExtraMain += THE_FRAG_CLIP_PLANES;
+ EOL" gl_Position = occProjectionMatrix * occWorldViewMatrix * occModelWorldMatrix * occVertex;"
EOL"}";
- const TCollection_AsciiString aLights = stdComputeLighting();
+ const TCollection_AsciiString aLights = stdComputeLighting ((theBits & OpenGl_PO_VertColor) != 0);
aSrcFrag = TCollection_AsciiString()
+ EOL"varying vec4 PositionWorld;"
EOL"varying vec4 Position;"
EOL"varying vec3 Normal;"
EOL"varying vec3 View;"
+ EOL
+ + aSrcFragExtraOut
+ + aSrcFragGetVertColor
+ aLights
+ + aSrcFragGetColor
+ EOL
EOL"void main()"
EOL"{"
+ aSrcFragExtraMain
- + EOL" gl_FragColor = computeLighting (normalize (Normal), normalize (View), Position, gl_FrontFacing);"
+ + EOL" gl_FragColor = getColor();"
EOL"}";
aProgramSrc->AttachShader (Graphic3d_ShaderObject::CreateFromSource (Graphic3d_TOS_VERTEX, aSrcVert));