Commit f9ecc028 authored by Marcus D. Hanwell's avatar Marcus D. Hanwell

BUG: Don't leak GL state for face culling.

This addresses bug 12588, where backface culling would leak and cause
text to fail to be rendered. The added test fails until the patch is
applied to PostRender in vtkOpenGLProperty.

Change-Id: I63ced0363b33914d23a92527d9a2cf70963649f7
parent 517fc220
......@@ -19,6 +19,7 @@ IF(VTK_USE_DISPLAY)
LoadOpenGLExtension.cxx
TestActorLightingFlag.cxx
TestAnimationScene.cxx
TestBackfaceCulling.cxx
TestBlurAndSobelPasses.cxx
TestDynamic2DLabelMapper.cxx
TestFBO.cxx
......
/*=========================================================================
Program: Visualization Toolkit
Module: TestBackfaceCulling.cxx
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// This tests backface culling with a text actor.
//
#include "vtkTestUtilities.h"
#include "vtkRegressionTestImage.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkCamera.h"
#include "vtkSphereSource.h"
#include "vtkActor.h"
#include "vtkProperty.h"
#include "vtkPolyDataMapper.h"
#include "vtkTextActor.h"
#include "vtkTextProperty.h"
#include "vtkNew.h"
int TestBackfaceCulling(int argc, char* argv[])
{
vtkNew<vtkRenderWindowInteractor> iren;
vtkNew<vtkRenderWindow> renWin;
iren->SetRenderWindow(renWin.GetPointer());
vtkNew<vtkRenderer> renderer;
renWin->AddRenderer(renderer.GetPointer());
renderer->SetBackground(0.0, 0.0, 0.5);
renWin->SetSize(300, 300);
// Set up the sphere
vtkNew<vtkSphereSource> sphere;
vtkNew<vtkPolyDataMapper> mapper;
vtkNew<vtkActor> actor;
mapper->SetInput(sphere->GetOutput());
actor->SetMapper(mapper.GetPointer());
actor->GetProperty()->SetColor(0, 1, 0);
actor->GetProperty()->SetBackfaceCulling(1);
renderer->AddActor(actor.GetPointer());
// Set up the text renderer.
vtkNew<vtkTextActor> text;
renderer->AddActor(text.GetPointer());
text->SetInput("Can you see me?");
text->SetDisplayPosition(3, 4);
renWin->Render();
renderer->ResetCamera();
renWin->Render();
int retVal = vtkRegressionTestImage(renWin.GetPointer());
if (retVal == vtkRegressionTester::DO_INTERACTOR)
{
iren->Start();
}
return !retVal;
}
......@@ -614,6 +614,13 @@ void vtkOpenGLProperty::PostRender(vtkActor *actor, vtkRenderer *renderer)
{
vtkOpenGLRenderer *oRenderer=static_cast<vtkOpenGLRenderer *>(renderer);
vtkShaderProgram2 *prog=oRenderer->GetShaderProgram();
// Reset the face culling now we are done, leaking into text actor etc.
if (this->BackfaceCulling || this->FrontfaceCulling)
{
glDisable(GL_CULL_FACE);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
if(this->CurrentShaderProgram2!=0) // ie if shaders are supported
{
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment