Limit number of lights (breaks compatibility with old hardware).
return;
}
- GLuint aPlanesNb = 0;
+ GLint aPlanesNb = 0;
for (Graphic3d_SequenceOfHClipPlane::Iterator anIter (myContext->Clipping().Planes());
anIter.More(); anIter.Next())
{
return;
}
- OpenGl_Vec4* anEquations = new OpenGl_Vec4[aPlanesNb];
- GLint* aSpaces = new GLint [aPlanesNb];
+ const Standard_Size MAX_CLIP_PLANES = 8;
+ OpenGl_Vec4* anEquations = new OpenGl_Vec4[MAX_CLIP_PLANES];
+ GLint* aSpaces = new GLint [MAX_CLIP_PLANES];
GLuint aPlaneId = 0;
for (Graphic3d_SequenceOfHClipPlane::Iterator anIter (myContext->Clipping().Planes());
anIter.More(); anIter.Next())
aSpaces[aPlaneId] = myContext->Clipping().GetEquationSpace (aPlane);
++aPlaneId;
}
- theProgram->SetUniform (myContext, aLocEquations, aPlanesNb, anEquations[0].GetData());
- theProgram->SetUniform (myContext, aLocSpaces, aPlanesNb, aSpaces);
+
+ theProgram->SetUniform (myContext,
+ theProgram->GetStateLocation (OpenGl_OCC_CLIP_PLANE_COUNT),
+ aPlanesNb);
+ theProgram->SetUniform (myContext, aLocEquations, MAX_CLIP_PLANES, anEquations);
+ theProgram->SetUniform (myContext, aLocSpaces, MAX_CLIP_PLANES, aSpaces);
delete[] anEquations;
delete[] aSpaces;
"occClipPlaneEquations", // OpenGl_OCC_CLIP_PLANE_EQUATIONS
"occClipPlaneSpaces", // OpenGl_OCC_CLIP_PLANE_SPACES
+ "occClipPlaneCount", // OpenGl_OCC_CLIP_PLANE_COUNT
"occLightSourcesCount", // OpenGl_OCC_LIGHT_SOURCE_COUNT
"occLightSourcesTypes", // OpenGl_OCC_LIGHT_SOURCE_TYPES
// OpenGL clip planes state
OpenGl_OCC_CLIP_PLANE_EQUATIONS,
OpenGl_OCC_CLIP_PLANE_SPACES,
+ OpenGl_OCC_CLIP_PLANE_COUNT,
// OpenGL light state
OpenGl_OCC_LIGHT_SOURCE_COUNT,
//! Parameters of clipping planes
uniform vec4 occClipPlaneEquations[THE_MAX_CLIP_PLANES];
uniform int occClipPlaneSpaces [THE_MAX_CLIP_PLANES];
+uniform int occClipPlaneCount; //!< Total number of clip planes
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
-varying vec3 View; //!< Direction to the viewer
-varying vec3 Normal; //!< Vertex normal in view space
-varying vec4 Position; //!< Vertex position in view space.
+varying vec3 View; //!< Direction to the viewer
+varying vec3 Normal; //!< Vertex normal in view space
+varying vec4 Position; //!< Vertex position in view space.
+varying vec4 PositionWorld; //!< Vertex position in world space
vec3 Ambient; //!< Ambient contribution of light sources
vec3 Diffuse; //!< Diffuse contribution of light sources
//! Entry point to the Fragment Shader
void main()
{
+ // process clipping planes
+ for (int anIndex = 0; anIndex < occClipPlaneCount; ++anIndex)
+ {
+ vec4 aClipEquation = occClipPlaneEquations[anIndex];
+ int aClipSpace = occClipPlaneSpaces[anIndex];
+ if (aClipSpace == OccEquationCoords_World)
+ {
+ if (dot (aClipEquation.xyz, PositionWorld.xyz) + aClipEquation.w < 0.0)
+ {
+ discard;
+ }
+ }
+ else if (aClipSpace == OccEquationCoords_View)
+ {
+ if (dot (aClipEquation.xyz, Position.xyz) + aClipEquation.w < 0.0)
+ {
+ discard;
+ }
+ }
+ }
+
gl_FragColor = computeLighting (normalize (Normal),
normalize (View),
Position);
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
-varying vec3 View; //!< Direction to the viewer
-varying vec3 Normal; //!< Vertex normal in view space
-varying vec4 Position; //!< Vertex position in view space
+varying vec3 View; //!< Direction to the viewer
+varying vec3 Normal; //!< Vertex normal in view space
+varying vec4 Position; //!< Vertex position in view space
+varying vec4 PositionWorld; //!< Vertex position in world space
//! Computes the normal in view space
vec3 TransformNormal (in vec3 theNormal)
//! Entry point to the Vertex Shader
void main()
{
- Position = occWorldViewMatrix * occModelWorldMatrix * occVertex; // position in the view space
- Normal = TransformNormal (occNormal); // normal in the view space
+ PositionWorld = occModelWorldMatrix * occVertex;
+ Position = occWorldViewMatrix * PositionWorld;
+ Normal = TransformNormal (occNormal);
// Note: The specified view vector is absolutely correct only for the orthogonal projection.
// For perspective projection it will be approximate, but it is in good agreement with the OpenGL calculations.