File: VolumetricModel.cpp

package info (click to toggle)
ospray 3.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,048 kB
  • sloc: cpp: 80,569; ansic: 951; sh: 805; makefile: 170; python: 69
file content (102 lines) | stat: -rw-r--r-- 2,954 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright 2009 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#ifdef OSPRAY_ENABLE_VOLUMES

#include "openvkl/openvkl.h"

// ospray
#include "VolumetricModel.h"

namespace ospray {

VolumetricModel::VolumetricModel(api::ISPCDevice &device, Volume *_volume)
    : AddStructShared(device.getDRTDevice(), device), volumeAPI(_volume)
{
  managedObjectType = OSP_VOLUMETRIC_MODEL;
}

VolumetricModel::~VolumetricModel()
{
  if (vklIntervalContext)
    vklRelease(vklIntervalContext);
}

std::string VolumetricModel::toString() const
{
  return "ospray::VolumetricModel";
}

void VolumetricModel::commit()
{
  volume = getParamObject<Volume>("volume", volumeAPI.ptr);
  if (!volume)
    throw std::runtime_error(toString() + " received NULL 'volume'");

  transferFunction = getParamObject<TransferFunction>("transferFunction");
  if (!transferFunction)
    throw std::runtime_error(toString() + " must have 'transferFunction'");

  // create value selector using transfer function and pass to volume
  if (volume->vklVolume) {
    if (vklIntervalContext) {
      vklRelease(vklIntervalContext);
    }

    vklIntervalContext = vklNewIntervalIteratorContext(volume->vklSampler);
    std::vector<range1f> valueRanges =
        transferFunction->getPositiveOpacityValueRanges();
    if (valueRanges.empty()) {
      // volume made completely transparent and could be removed, which is
      // awkward here
      // set an "empty" interesting value range instead, which will lead to a
      // quick out during volume iteration
      valueRanges.push_back(range1f(neg_inf, neg_inf));
    }
    VKLData valueRangeData = vklNewData(getISPCDevice().getVklDevice(),
        valueRanges.size(),
        VKL_BOX1F,
        valueRanges.data());
    vklSetData(vklIntervalContext, "valueRanges", valueRangeData);
    vklRelease(valueRangeData);
    vklCommit(vklIntervalContext);

    // Pass interval context to ISPC
    getSh()->vklIntervalContext = vklIntervalContext;
  }

  // Finish getting/setting other appearance information
  volumeBounds = volume->bounds;

  // Initialize shared structure
  getSh()->volume = getVolume()->getSh();
  getSh()->transferFunction = transferFunction->getSh();
  getSh()->boundingBox = volumeBounds;
  getSh()->densityScale = getParam<float>("densityScale", 1.f);
  getSh()->anisotropy = getParam<float>("anisotropy", 0.f);
  getSh()->gradientShadingScale = getParam<float>("gradientShadingScale", 0.f);
  getSh()->userID = getParam<uint32>("id", RTC_INVALID_GEOMETRY_ID);

  featureFlagsOther = FFO_VOLUME_IN_SCENE;
  if (getSh()->gradientShadingScale > 0.f)
    featureFlagsOther |= FFO_VOLUME_SCIVIS_SHADING;
}

RTCGeometry VolumetricModel::embreeGeometryHandle() const
{
  return volume->embreeGeometry;
}

box3f VolumetricModel::bounds() const
{
  return volumeBounds;
}

Ref<Volume> VolumetricModel::getVolume() const
{
  return volume;
}

OSPTYPEFOR_DEFINITION(VolumetricModel *);

} // namespace ospray
#endif