MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = MAX_UNIFORM_BLOCKS_COMPONENTS + 4 * VERTEX_UNIFORM_VECTORS,\r
MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,\r
MAX_UNIFORM_BUFFER_BINDINGS = 36,\r
+ MAX_CLIP_PLANES = 6,\r
};\r
\r
#endif // sw_Config_hpp\r
setVertexAttrib(sw::Normal, 0.0f, 0.0f, 1.0f, 1.0f);\r
setVertexAttrib(sw::PointSize, 1.0f, 1.0f, 1.0f, 1.0f);\r
\r
+ clipFlags = 0;\r
+\r
mHasBeenCurrent = false;\r
\r
markAllStateDirty();\r
case GL_MAX_PROJECTION_STACK_DEPTH: *params = MAX_PROJECTION_STACK_DEPTH; break;\r
case GL_MAX_TEXTURE_STACK_DEPTH: *params = MAX_TEXTURE_STACK_DEPTH; break;\r
case GL_MAX_TEXTURE_UNITS: *params = MAX_TEXTURE_UNITS; break;\r
+ case GL_MAX_CLIP_PLANES: *params = MAX_CLIP_PLANES; break;\r
default:\r
return false;\r
}\r
case GL_MAX_PROJECTION_STACK_DEPTH:\r
case GL_MAX_TEXTURE_STACK_DEPTH:\r
case GL_MAX_TEXTURE_UNITS:\r
+ case GL_MAX_CLIP_PLANES:\r
return 1;\r
default:\r
UNREACHABLE(pname);\r
currentMatrixStack().ortho(left, right, bottom, top, zNear, zFar);\r
}\r
\r
+void Context::setClipPlane(int index, const float plane[4])\r
+{\r
+ sw::Plane clipPlane = modelViewStack.current() * sw::Plane(plane);\r
+ device->setClipPlane(index, &clipPlane.A);\r
+}\r
+\r
+void Context::setClipPlaneEnable(int index, bool enable)\r
+{\r
+ clipFlags = clipFlags & ~((int)!enable << index) | ((int)enable << index);\r
+ device->setClipFlags(clipFlags);\r
+}\r
+\r
void Context::clientActiveTexture(GLenum texture)\r
{\r
clientTexture = texture;\r
void frustum(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);\r
void ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar);\r
\r
+ void setClipPlane(int index, const float plane[4]);\r
+ void setClipPlaneEnable(int index, bool enable);\r
+\r
private:\r
virtual ~Context();\r
\r
bool textureExternalEnabled[MAX_TEXTURE_UNITS];\r
GLenum clientTexture;\r
\r
+ int clipFlags;\r
+\r
Device *device;\r
ResourceManager *mResourceManager;\r
};\r
\r
void ClipPlanef(GLenum plane, const GLfloat *equation)\r
{\r
- UNIMPLEMENTED();\r
+ TRACE("(GLenum plane = 0x%X, const GLfloat *equation)", plane);\r
+\r
+ int index = plane - GL_CLIP_PLANE0;\r
+\r
+ if(index < 0 || index >= MAX_CLIP_PLANES)\r
+ {\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
+\r
+ es1::Context *context = es1::getContext();\r
+\r
+ if(context)\r
+ {\r
+ context->setClipPlane(index, equation);\r
+ }\r
}\r
\r
void ClipPlanex(GLenum plane, const GLfixed *equation)\r
case GL_TEXTURE_COORD_ARRAY: UNIMPLEMENTED(); break;\r
case GL_MULTISAMPLE: UNIMPLEMENTED(); break;\r
case GL_SAMPLE_ALPHA_TO_ONE: UNIMPLEMENTED(); break;\r
+ case GL_CLIP_PLANE0: context->setClipPlaneEnable(0, false); break;\r
+ case GL_CLIP_PLANE1: context->setClipPlaneEnable(1, false); break;\r
+ case GL_CLIP_PLANE2: context->setClipPlaneEnable(2, false); break;\r
+ case GL_CLIP_PLANE3: context->setClipPlaneEnable(3, false); break;\r
+ case GL_CLIP_PLANE4: context->setClipPlaneEnable(4, false); break;\r
+ case GL_CLIP_PLANE5: context->setClipPlaneEnable(5, false); break;\r
default:\r
return error(GL_INVALID_ENUM);\r
}\r
case GL_TEXTURE_COORD_ARRAY: UNIMPLEMENTED(); break;\r
case GL_MULTISAMPLE: UNIMPLEMENTED(); break;\r
case GL_SAMPLE_ALPHA_TO_ONE: UNIMPLEMENTED(); break;\r
+ case GL_CLIP_PLANE0: context->setClipPlaneEnable(0, true); break;\r
+ case GL_CLIP_PLANE1: context->setClipPlaneEnable(1, true); break;\r
+ case GL_CLIP_PLANE2: context->setClipPlaneEnable(2, true); break;\r
+ case GL_CLIP_PLANE3: context->setClipPlaneEnable(3, true); break;\r
+ case GL_CLIP_PLANE4: context->setClipPlaneEnable(4, true); break;\r
+ case GL_CLIP_PLANE5: context->setClipPlaneEnable(5, true); break;\r
default:\r
return error(GL_INVALID_ENUM);\r
}\r
void Renderer::setClipPlane(unsigned int index, const float plane[4])
{
- if(index < 6)
+ if(index < MAX_CLIP_PLANES)
{
userPlane[index] = plane;
}
Primitive *primitiveBatch[16];
// User-defined clipping planes
- Plane userPlane[6];
- Plane clipPlane[6]; // Tranformed to clip space
+ Plane userPlane[MAX_CLIP_PLANES];
+ Plane clipPlane[MAX_CLIP_PLANES]; // Tranformed to clip space
bool updateClipPlanes;
volatile bool exitThreads;