vtk-m/vtkm/rendering/MapperVolume.cxx

154 lines
4.3 KiB
C++
Raw Normal View History

//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
2019-04-15 23:24:21 +00:00
//
// 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 <vtkm/rendering/MapperVolume.h>
#include <vtkm/cont/Timer.h>
#include <vtkm/cont/TryExecute.h>
#include <vtkm/rendering/CanvasRayTracer.h>
#include <vtkm/rendering/raytracing/Camera.h>
#include <vtkm/rendering/raytracing/Logger.h>
#include <vtkm/rendering/raytracing/RayOperations.h>
#include <vtkm/rendering/raytracing/VolumeRendererStructured.h>
#include <sstream>
#define DEFAULT_SAMPLE_DISTANCE -1.f
2017-05-18 14:29:41 +00:00
namespace vtkm
{
namespace rendering
{
struct MapperVolume::InternalsType
{
2017-05-18 14:29:41 +00:00
vtkm::rendering::CanvasRayTracer* Canvas;
vtkm::Float32 SampleDistance;
bool CompositeBackground;
VTKM_CONT
InternalsType()
2017-05-18 14:29:41 +00:00
: Canvas(nullptr)
, SampleDistance(DEFAULT_SAMPLE_DISTANCE)
, CompositeBackground(true)
{
}
};
MapperVolume::MapperVolume()
: Internals(new InternalsType)
2017-05-18 14:29:41 +00:00
{
}
MapperVolume::~MapperVolume() {}
2017-05-18 14:29:41 +00:00
void MapperVolume::SetCanvas(vtkm::rendering::Canvas* canvas)
{
2017-05-18 14:29:41 +00:00
if (canvas != nullptr)
{
this->Internals->Canvas = dynamic_cast<CanvasRayTracer*>(canvas);
2017-05-18 14:29:41 +00:00
if (this->Internals->Canvas == nullptr)
{
2017-05-18 14:29:41 +00:00
throw vtkm::cont::ErrorBadValue("Ray Tracer: bad canvas type. Must be CanvasRayTracer");
}
}
else
{
this->Internals->Canvas = nullptr;
}
}
2017-05-18 14:29:41 +00:00
vtkm::rendering::Canvas* MapperVolume::GetCanvas() const
{
return this->Internals->Canvas;
}
2017-05-18 14:29:41 +00:00
void MapperVolume::RenderCells(const vtkm::cont::DynamicCellSet& cellset,
const vtkm::cont::CoordinateSystem& coords,
const vtkm::cont::Field& scalarField,
const vtkm::cont::ColorTable& vtkmNotUsed(colorTable),
2017-05-18 14:29:41 +00:00
const vtkm::rendering::Camera& camera,
const vtkm::Range& scalarRange)
{
2017-05-18 14:29:41 +00:00
if (!cellset.IsSameType(vtkm::cont::CellSetStructured<3>()))
{
std::stringstream msg;
std::string theType = typeid(cellset).name();
msg << "Mapper volume: cell set type not currently supported\n";
msg << "Type : " << theType << std::endl;
throw vtkm::cont::ErrorBadValue(msg.str());
}
else
{
raytracing::Logger* logger = raytracing::Logger::GetInstance();
logger->OpenLogEntry("mapper_volume");
vtkm::cont::Timer tot_timer;
tot_timer.Start();
vtkm::cont::Timer timer;
vtkm::rendering::raytracing::VolumeRendererStructured tracer;
vtkm::rendering::raytracing::Camera rayCamera;
vtkm::rendering::raytracing::Ray<vtkm::Float32> rays;
vtkm::Int32 width = (vtkm::Int32)this->Internals->Canvas->GetWidth();
vtkm::Int32 height = (vtkm::Int32)this->Internals->Canvas->GetHeight();
2020-02-18 03:00:09 +00:00
rayCamera.SetParameters(camera, width, height);
2018-09-11 02:25:42 +00:00
rayCamera.CreateRays(rays, coords.GetBounds());
rays.Buffers.at(0).InitConst(0.f);
raytracing::RayOperations::MapCanvasToRays(rays, camera, *this->Internals->Canvas);
if (this->Internals->SampleDistance != DEFAULT_SAMPLE_DISTANCE)
{
tracer.SetSampleDistance(this->Internals->SampleDistance);
}
tracer.SetData(
coords, scalarField, cellset.Cast<vtkm::cont::CellSetStructured<3>>(), scalarRange);
tracer.SetColorMap(this->ColorMap);
tracer.Render(rays);
timer.Start();
2017-08-01 17:06:37 +00:00
this->Internals->Canvas->WriteToCanvas(rays, rays.Buffers.at(0).Buffer, camera);
if (this->Internals->CompositeBackground)
{
this->Internals->Canvas->BlendBackground();
}
vtkm::Float64 time = timer.GetElapsedTime();
logger->AddLogData("write_to_canvas", time);
time = tot_timer.GetElapsedTime();
logger->CloseLogEntry(time);
}
}
2017-05-18 14:29:41 +00:00
vtkm::rendering::Mapper* MapperVolume::NewCopy() const
{
return new vtkm::rendering::MapperVolume(*this);
}
void MapperVolume::SetSampleDistance(const vtkm::Float32 sampleDistance)
{
this->Internals->SampleDistance = sampleDistance;
}
void MapperVolume::SetCompositeBackground(const bool compositeBackground)
{
this->Internals->CompositeBackground = compositeBackground;
}
}
} // namespace vtkm::rendering