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.
nmWTAI-Platform/3rd/VTK7.1/source/VTK-7.1.1/Rendering/OpenGL/vtkPrimitivePainter.cxx

337 lines
9.1 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkPrimitivePainter.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 "vtkPrimitivePainter.h"
#include "vtkActor.h"
#include "vtkCellData.h"
#include "vtkDataSetAttributes.h"
#include "vtkGarbageCollector.h"
#include "vtkGenericVertexAttributeMapping.h"
#include "vtkInformation.h"
#include "vtkInformationIntegerKey.h"
#include "vtkInformationObjectBaseKey.h"
#include "vtkObjectFactory.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkProperty.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkTimerLog.h"
#include "vtkUnsignedCharArray.h"
#include "vtkShaderDeviceAdapter2.h"
//---------------------------------------------------------------------------
vtkPrimitivePainter::vtkPrimitivePainter()
{
this->SupportedPrimitive = 0x0; // must be set by subclasses. No primitive
// supported by default.
this->DisableScalarColor = 0;
this->OutputData = vtkPolyData::New();
this->GenericVertexAttributes = false;
this->MultiTextureAttributes = false;
}
//---------------------------------------------------------------------------
vtkPrimitivePainter::~vtkPrimitivePainter()
{
if( this->OutputData )
{
this->OutputData->Delete();
this->OutputData = 0;
}
}
//---------------------------------------------------------------------------
void vtkPrimitivePainter::ReportReferences(vtkGarbageCollector *collector)
{
this->Superclass::ReportReferences(collector);
vtkGarbageCollectorReport(collector, this->OutputData, "Output Data");
}
//---------------------------------------------------------------------------
vtkDataObject* vtkPrimitivePainter::GetOutput()
{
return this->OutputData;
}
//---------------------------------------------------------------------------
void vtkPrimitivePainter::ProcessInformation(vtkInformation *info)
{
this->GenericVertexAttributes = false;
if (info->Has(DATA_ARRAY_TO_VERTEX_ATTRIBUTE()))
{
vtkGenericVertexAttributeMapping *mappings =
vtkGenericVertexAttributeMapping::SafeDownCast(
info->Get(DATA_ARRAY_TO_VERTEX_ATTRIBUTE()));
this->GenericVertexAttributes = mappings &&
(mappings->GetNumberOfMappings() > 0);
this->MultiTextureAttributes = false;
if (mappings)
{
for (unsigned int i = 0; i < mappings->GetNumberOfMappings(); ++i)
{
if (mappings->GetTextureUnit(i) >= 0)
{
this->MultiTextureAttributes = true;
break;
}
}
}
}
if (info->Has(DISABLE_SCALAR_COLOR()) &&
info->Get(DISABLE_SCALAR_COLOR()) == 1)
{
this->DisableScalarColor = 1;
}
else
{
this->DisableScalarColor = 0;
}
}
//---------------------------------------------------------------------------
void vtkPrimitivePainter::PrepareForRendering(vtkRenderer* renderer,
vtkActor* actor)
{
// Here, we don't use the this->StaticData flag to mean that the input
// can never change, since the input may be the output of
// some filtering painter that filter on actor/renderer properties
// and not on the input polydata. Hence the input polydata
// may get modified even if the input to the PolyDataMapper is
// immutable.
// If the input has changed update the output.
if (this->OutputUpdateTime < this->MTime ||
this->OutputUpdateTime < this->GetInput()->GetMTime())
{
this->OutputData->ShallowCopy(this->GetInputAsPolyData());
this->OutputUpdateTime.Modified();
}
this->Superclass::PrepareForRendering(renderer, actor);
}
//---------------------------------------------------------------------------
void vtkPrimitivePainter::RenderInternal(vtkRenderer* renderer,
vtkActor* act,
unsigned long typeflags,
bool forceCompileOnly)
{
unsigned long supported_typeflags = this->SupportedPrimitive & typeflags;
if (!supported_typeflags)
{
// no supported primitive requested to be rendered.
this->Superclass::RenderInternal(renderer, act, typeflags,
forceCompileOnly);
return;
}
if (!renderer->GetRenderWindow()->GetPainterDeviceAdapter())
{
vtkErrorMacro("Painter Device Adapter is missing!");
return;
}
this->Timer->StartTimer();
int interpolation;
float tran;
vtkProperty *prop;
vtkUnsignedCharArray *c=NULL;
vtkDataArray *n;
vtkDataArray *t;
vtkDataArray *ef;
int tDim;
vtkPolyData *input = this->GetInputAsPolyData();
int cellNormals;
int cellScalars = 0;
int fieldScalars = 0;
// get the property
prop = act->GetProperty();
// get the transparency
tran = prop->GetOpacity();
// if the primitives are invisible then get out of here
if (tran <= 0.0)
{
return;
}
// get the shading interpolation
interpolation = prop->GetInterpolation();
if (!this->DisableScalarColor)
{
// are they cell or point scalars
c = vtkArrayDownCast<vtkUnsignedCharArray>(input->GetPointData()->GetScalars());
if (!c)
{
c = vtkArrayDownCast<vtkUnsignedCharArray>(input->GetCellData()->GetScalars());
cellScalars = 1;
}
if (!c)
{
c = vtkArrayDownCast<vtkUnsignedCharArray>(input->GetFieldData()->
GetArray("Color"));
fieldScalars = 1; // note when fieldScalars == 1, also cellScalars == 1.
// this ensures that primitive painters that do not distinguish between
// fieldScalars and cellScalars (eg. Verts/Lines/Polys painters) can ignore
// fieldScalars flag.
}
}
n = input->GetPointData()->GetNormals();
if (interpolation == VTK_FLAT)
{
// shunt point normals.
n = 0;
if (this->OutputData->GetPointData()->GetNormals())
{
this->OutputData->GetPointData()->SetNormals(0);
}
}
cellNormals = 0;
if (n == 0 && input->GetCellData()->GetNormals())
{
cellNormals = 1;
n = input->GetCellData()->GetNormals();
}
unsigned long idx = 0;
if (n && !cellNormals)
{
idx |= VTK_PDM_NORMALS;
}
if (c)
{
idx |= VTK_PDM_COLORS;
if (
/* RGBA */
(c->GetNumberOfComponents() == 4 && c->GetValueRange(3)[0] == 255) ||
/* LuminanceAlpha */
(c->GetNumberOfComponents() == 2 && c->GetValueRange(1)[0] == 255))
{
// If the opacity is 255, don't bother send the opacity values to OpenGL.
// Treat the colors are opaque colors (which they are).
idx |= VTK_PDM_OPAQUE_COLORS;
}
if (cellScalars)
{
idx |= VTK_PDM_CELL_COLORS;
}
if (fieldScalars)
{
idx |= VTK_PDM_FIELD_COLORS;
}
}
if (cellNormals)
{
idx |= VTK_PDM_CELL_NORMALS;
}
// Texture and color by texture
t = input->GetPointData()->GetTCoords();
if ( t )
{
tDim = t->GetNumberOfComponents();
if (tDim > 3)
{
vtkDebugMacro(<< "Currently only 1d, 2d and 3d texture coordinates are supported.\n");
t = NULL;
}
}
// Set the flags
if (t)
{
idx |= VTK_PDM_TCOORDS;
}
// Edge flag
ef = input->GetPointData()->GetAttribute(vtkDataSetAttributes::EDGEFLAG);
if (ef && ef->GetNumberOfComponents() != 1)
{
vtkDebugMacro(<< "Currently only 1d edge flags are supported.");
ef = NULL;
}
if (ef && !ef->IsA("vtkUnsignedCharArray"))
{
vtkDebugMacro(<< "Currently only unsigned char edge flags are suported.");
ef = NULL;
}
// Set the flags
if (ef)
{
idx |= VTK_PDM_EDGEFLAGS;
}
if (!act)
{
vtkErrorMacro("No actor");
}
vtkShaderDeviceAdapter2 *shaderDevice2 = NULL;
if (prop->GetShading())
{
shaderDevice2 = prop->GetShaderDeviceAdapter2();
}
if(!shaderDevice2)
{
// load the shader device adapator from the information object
shaderDevice2 =
vtkShaderDeviceAdapter2::SafeDownCast(
this->GetInformation()->Get(SHADER_DEVICE_ADAPTOR()));
}
if (shaderDevice2 && this->GenericVertexAttributes)
{
idx |= VTK_PDM_GENERIC_VERTEX_ATTRIBUTES;
}
if (this->MultiTextureAttributes)
{
idx |= VTK_PDM_GENERIC_VERTEX_ATTRIBUTES;
}
if (this->RenderPrimitive(idx, n, c, t, renderer))
{
// subclass rendered the supported primitive successfully.
// The delegate need not render it.
typeflags &= (~this->SupportedPrimitive);
}
this->Timer->StopTimer();
this->TimeToDraw = this->Timer->GetElapsedTime();
this->Superclass::RenderInternal(renderer, act, typeflags,forceCompileOnly);
}
//---------------------------------------------------------------------------
void vtkPrimitivePainter::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
os << indent << "SupportedPrimitive: " << this->SupportedPrimitive << endl;
}