Commit daf8c6e7 authored by Utkarsh Ayachit's avatar Utkarsh Ayachit
Browse files

BUG #14828: Keep surface color from interacting with scalar color.

When using scalar coloring, if vtkScalarsToColorsPainter decided to use
a texture for mapping the scalars to colors, we ended up with the
surface color bleeding through the texture. This commit ensures that
such bleeding is avoided.

We don't simply use glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_REPLACE), since that results in the diffuse highlights being lost.
By enabling GL_COLOR_MATERIAL and calling glColor3f(1,1,1), we follow
the same lighting/coloring path as we would when not using the texture
for scalar coloring.

Change-Id: I9c4db15dd0db699d5d045fa7ae27696d18828988
parent abf3539c
......@@ -10,6 +10,7 @@ vtk_add_test_cxx(${vtk-module}CxxTests render_window_tests
TestGPUInfo.cxx,NO_VALID
TestMonitors.cxx,NO_VALID
TestPOVExporter.cxx,NO_VALID
TestScalarsToColorsPainter.cxx
TestSetImageOrientation.cxx
TestTDx.cxx
)
......
/*=========================================================================
Program: Visualization Toolkit
Module: TestScalarsToColorsPainter.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 test covers the vtkOpenGLScalarsToColorPainter to ensure that
// when the option InterpolateScalarsBeforeMapping is on,
// rendering is correct. It verifies a bug fix for 14828
#include "vtkActor.h"
#include "vtkColorTransferFunction.h"
#include "vtkCylinderSource.h"
#include "vtkDataArray.h"
#include "vtkExtractEdges.h"
#include "vtkNew.h"
#include "vtkPainterPolyDataMapper.h"
#include "vtkPointData.h"
#include "vtkProperty.h"
#include "vtkRegressionTestImage.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkTestUtilities.h"
int TestScalarsToColorsPainter(int argc, char* argv[])
{
// Set up cylinder source
vtkNew<vtkCylinderSource> cylinder;
cylinder->CappingOn();
cylinder->SetResolution(32);
cylinder->Update();
vtkNew<vtkExtractEdges> edges;
edges->SetInputConnection(cylinder->GetOutputPort());
// Set up lookup table
vtkNew<vtkColorTransferFunction> lookupTable;
lookupTable->AddRGBPoint(0.0, 1.0, 1.0, 1.0);
lookupTable->AddRGBPoint(1.0, 1.0, 0.0, 0.0);
lookupTable->SetVectorModeToComponent();
lookupTable->SetVectorComponent(0);
// Set display to wireframe
vtkNew<vtkPainterPolyDataMapper> mapper;
mapper->SetInputConnection(edges->GetOutputPort());
mapper->SetLookupTable(lookupTable.GetPointer());
mapper->SelectColorArray("TCoords");
mapper->SetScalarModeToUsePointFieldData();
mapper->ScalarVisibilityOn();
mapper->InterpolateScalarsBeforeMappingOn();
vtkNew<vtkActor> actor;
actor->SetMapper(mapper.GetPointer());
// Set the wireframe color to something non-white
vtkProperty* property = actor->GetProperty();
property->SetRepresentationToSurface();
property->SetAmbient(1.0);
property->SetDiffuse(0.0);
// Set the color to black to test that bug 14828 is fixed
property->SetColor(0.0, 0.0, 0.0);
// Render image
vtkNew<vtkRenderer> renderer;
renderer->AddActor(actor.GetPointer());
vtkNew<vtkRenderWindow> renWin;
renWin->SetMultiSamples(0);
renWin->SetAlphaBitPlanes(1);
renWin->AddRenderer(renderer.GetPointer());
vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin.GetPointer());
// Compare image
int retVal = vtkRegressionTestImage(renWin.GetPointer());
if (retVal == vtkRegressionTester::DO_INTERACTOR)
{
iren->Start();
}
return !retVal;
}
......@@ -155,9 +155,7 @@ void vtkOpenGLScalarsToColorsPainter::RenderInternal(vtkRenderer *renderer,
this->InternalColorTexture->RepeatOff();
}
this->InternalColorTexture->SetInputData(this->ColorTextureMap);
// Keep color from interacting with texture.
float info[4] = { 1.0, 1.0, 1.0, 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, info);
this->LastWindow = renderer->GetRenderWindow();
}
......@@ -195,14 +193,17 @@ void vtkOpenGLScalarsToColorsPainter::RenderInternal(vtkRenderer *renderer,
lmcolorMode = GL_DIFFUSE;
}
glColorMaterial(GL_FRONT_AND_BACK, lmcolorMode);
glEnable(GL_COLOR_MATERIAL);
if (this->ColorTextureMap)
{
this->InternalColorTexture->Load(renderer);
}
else
{
glColorMaterial( GL_FRONT_AND_BACK, lmcolorMode);
glEnable(GL_COLOR_MATERIAL);
// Keep the surface color from interacting with color loaded from texture.
// We don't simple use (GL_TEXTURE_ENV_MODE, GL_REPLACE) since that
// implies all the lighting colors are lost too i.e. no diffuse
// highlights.
glColor3f(1.0, 1.0, 1.0);
}
}
......
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