You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
4.0 KiB
C++
135 lines
4.0 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkOpenGLRepresentationPainter.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.
|
|
|
|
=========================================================================*/
|
|
|
|
#include "vtkOpenGLRepresentationPainter.h"
|
|
|
|
#include "vtkActor.h"
|
|
#include "vtkInformation.h"
|
|
#include "vtkInformationIntegerKey.h"
|
|
#include "vtkObjectFactory.h"
|
|
#include "vtkPrimitivePainter.h"
|
|
#include "vtkProperty.h"
|
|
|
|
#include "vtkOpenGL.h"
|
|
#include "vtkOpenGLError.h"
|
|
|
|
vtkStandardNewMacro(vtkOpenGLRepresentationPainter);
|
|
|
|
//-----------------------------------------------------------------------------
|
|
vtkOpenGLRepresentationPainter::vtkOpenGLRepresentationPainter()
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
vtkOpenGLRepresentationPainter::~vtkOpenGLRepresentationPainter()
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void vtkOpenGLRepresentationPainter::RenderInternal(vtkRenderer *renderer,
|
|
vtkActor *actor,
|
|
unsigned long typeflags,
|
|
bool forceCompileOnly)
|
|
{
|
|
vtkOpenGLClearErrorMacro();
|
|
|
|
vtkProperty* prop = actor->GetProperty();
|
|
int rep = prop->GetRepresentation();
|
|
int reset_needed = 0;
|
|
|
|
GLenum face = GL_FRONT_AND_BACK;
|
|
|
|
// If both front & back culling is on, will fall into backface culling.
|
|
if (prop->GetBackfaceCulling())
|
|
{
|
|
face = GL_FRONT;
|
|
}
|
|
else if (prop->GetFrontfaceCulling())
|
|
{
|
|
face = GL_BACK;
|
|
}
|
|
|
|
switch (rep)
|
|
{
|
|
case VTK_POINTS:
|
|
glPolygonMode(face, GL_POINT);
|
|
reset_needed = 1;
|
|
break;
|
|
case VTK_WIREFRAME:
|
|
glPolygonMode(face, GL_LINE);
|
|
reset_needed = 1;
|
|
break;
|
|
}
|
|
|
|
bool draw_surface_with_edges =
|
|
(prop->GetEdgeVisibility() && prop->GetRepresentation() == VTK_SURFACE);
|
|
if (draw_surface_with_edges)
|
|
{
|
|
glPolygonOffset(0.7, 1.0);
|
|
glEnable(GL_POLYGON_OFFSET_FILL);
|
|
}
|
|
|
|
this->Superclass::RenderInternal(renderer, actor, typeflags,
|
|
forceCompileOnly);
|
|
if (draw_surface_with_edges)
|
|
{
|
|
glDisable(GL_POLYGON_OFFSET_FILL);
|
|
}
|
|
this->TimeToDraw += this->DelegatePainter?
|
|
this->DelegatePainter->GetTimeToDraw() : 0;
|
|
if (reset_needed)
|
|
{
|
|
// reset the default.
|
|
glPolygonMode(face, GL_FILL);
|
|
}
|
|
|
|
if (draw_surface_with_edges)
|
|
{
|
|
glPushAttrib(GL_CURRENT_BIT|GL_LIGHTING_BIT|GL_ENABLE_BIT);
|
|
double color[4];
|
|
prop->GetEdgeColor(color);
|
|
color[0] *= prop->GetOpacity();
|
|
color[1] *= prop->GetOpacity();
|
|
color[2] *= prop->GetOpacity();
|
|
color[3] = prop->GetOpacity();
|
|
|
|
glDisable(GL_LIGHTING);
|
|
glColor4dv(color);
|
|
glPolygonMode(face, GL_LINE);
|
|
|
|
// Disable textures when rendering the surface edges.
|
|
// This ensures that edges are always drawn solid.
|
|
glDisable(GL_TEXTURE_2D);
|
|
|
|
this->Information->Set(vtkPolyDataPainter::DISABLE_SCALAR_COLOR(), 1);
|
|
this->Superclass::RenderInternal(renderer, actor, typeflags,
|
|
forceCompileOnly);
|
|
this->TimeToDraw += this->DelegatePainter?
|
|
this->DelegatePainter->GetTimeToDraw() : 0;
|
|
this->Information->Remove(vtkPolyDataPainter::DISABLE_SCALAR_COLOR());
|
|
|
|
// reset the default.
|
|
glPolygonMode(face, GL_FILL);
|
|
|
|
glPopAttrib(); //(GL_CURRENT_BIT|GL_LIGHTING|GL_ENABLE_BIT)
|
|
}
|
|
vtkOpenGLCheckErrorMacro("failed after RenderInternal");
|
|
}
|
|
//-----------------------------------------------------------------------------
|
|
void vtkOpenGLRepresentationPainter::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os, indent);
|
|
}
|