void OpenGLRenderer::SetCulling(CullingMode mode) {
	if(mode == m_cachedCullMode)
		return;

	m_cachedCullMode = mode;

	if(mode == CullNone) {
		setGLState(GL_CULL_FACE, false);
	} else {
		setGLState(GL_CULL_FACE, true);
		glCullFace(arxToGlCullMode[mode]);
	}
}
void OpenGLRenderer::SetAntialiasing(bool enable) {
	
	// This is mostly useless as multisampling must be enabled/disabled at GL context creation.
	setGLState(GL_MULTISAMPLE, enable);
	
	CHECK_GL;
}
void OpenGLRenderer::SetAntialiasing(bool enable) {
	
	bool colorkey = m_hasColorKey;
	if(colorkey) {
		SetRenderState(ColorKey, false);
	}
	
	// This is mostly useless as multisampling must be enabled/disabled at GL context creation.
	setGLState(GL_MULTISAMPLE, enable);
	
	m_hasMSAA = enable;
	
	if(colorkey) {
		SetRenderState(ColorKey, true);
	}
}
void OpenGLRenderer::SetRenderState(RenderState renderState, bool enable) {
	
	switch(renderState) {
		
		case AlphaBlending: {
			setGLState(GL_BLEND, enable);
			break;
		}
		
		case AlphaTest: {
			setGLState(GL_ALPHA_TEST, enable);
			break;
		}

		case ColorKey: {
			SetRenderState(AlphaTest, enable);
			if(enable)
				SetAlphaFunc(CmpNotEqual, 0.0f);
			break;
		}
		
		case DepthTest: {
			setGLState(GL_DEPTH_TEST, enable);
			break;
		}
		
		case DepthWrite: {
			glDepthMask(enable ? GL_TRUE : GL_FALSE);
			break;
		}
		
		case Fog: {
			setGLState(GL_FOG, enable);
			break;
		}
		
		case Lighting: {
			setGLState(GL_LIGHTING, enable);
			break;
		}
		
		case ZBias: {
			setGLState(GL_POLYGON_OFFSET_FILL, enable);
			break;
		}
		
		default:
			LogWarning << "unsupported render state: " << renderState;
	}
	
	CHECK_GL;
}
void RenderSystem::setCulling(
    bool enable
) {
    setGLState(GL_CULL_FACE, enable);
}
void RenderSystem::setBlend(
    bool enable
) {
    setGLState(GL_BLEND, enable);
}
void RenderSystem::setDepthTest(
    bool enable
) {
    setGLState(GL_DEPTH_TEST, enable);
}
void OpenGLRenderer::SetRenderState(RenderState renderState, bool enable) {
	
	switch(renderState) {
		
		case AlphaBlending: {
			if(m_hasBlend == enable) {
				return;
			}
			/*
			 * When rendering color-keyed textures with GL_BLEND enabled we still
			 * need to 'discard' transparent texels, as blending might not use the src alpha!
			 * On the other hand, we can't use GL_SAMPLE_ALPHA_TO_COVERAGE when blending
			 * as that could result in the src alpha being applied twice (e.g. for text).
			 * So we must toggle between alpha to coverage and alpha test when toggling blending.
			 * TODO Fix it so that the apha channel from the color-keyed textures is
			 *      always used as part of the blending factor.
			 */
			bool colorkey = m_hasColorKey;
			if(colorkey && m_hasMSAA) {
				SetRenderState(ColorKey, false);
			}
			m_hasBlend = enable;
			if(colorkey && m_hasMSAA) {
				SetRenderState(ColorKey, true);
			}
			setGLState(GL_BLEND, enable);
			break;
		}
		
		case ColorKey: {
			if(m_hasColorKey == enable) {
				return;
			}
			m_hasColorKey = enable;
			if(m_hasMSAA && !m_hasBlend) {
				// TODO(option-video) add a config option for this
				setGLState(GL_SAMPLE_ALPHA_TO_COVERAGE, enable);
			} else {
				setGLState(GL_ALPHA_TEST, enable);
				if(enable) {
					SetAlphaFunc(CmpNotEqual, 0.0f);
				}
			}
			break;
		}
		
		case DepthTest: {
			glDepthFunc(enable ? GL_LEQUAL : GL_ALWAYS);
			break;
		}
		
		case DepthWrite: {
			glDepthMask(enable ? GL_TRUE : GL_FALSE);
			break;
		}
		
		case Fog: {
			setGLState(GL_FOG, enable);
			break;
		}
		
		case Lighting: {
			setGLState(GL_LIGHTING, enable);
			break;
		}
		
		case ZBias: {
			setGLState(GL_POLYGON_OFFSET_FILL, enable);
			break;
		}
		
		default:
			LogWarning << "Unsupported render state: " << renderState;
	}
}