Welcome to mirror list, hosted at ThFree Co, Russian Federation.

volume.cpp « hydra « cycles « intern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 7b965c613ed8a718cbafe1edef891da6bf7c0ee4 (plain)
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
/* SPDX-License-Identifier: Apache-2.0
 * Copyright 2022 NVIDIA Corporation
 * Copyright 2022 Blender Foundation */

#include "hydra/volume.h"
#include "hydra/field.h"
#include "hydra/geometry.inl"
#include "scene/volume.h"

HDCYCLES_NAMESPACE_OPEN_SCOPE

// clang-format off
TF_DEFINE_PRIVATE_TOKENS(_tokens,
   (openvdbAsset)
);
// clang-format on

HdCyclesVolume::HdCyclesVolume(const SdfPath &rprimId
#if PXR_VERSION < 2102
                               ,
                               const SdfPath &instancerId
#endif
                               )
    : HdCyclesGeometry(rprimId
#if PXR_VERSION < 2102
                       ,
                       instancerId
#endif
      )
{
}

HdCyclesVolume::~HdCyclesVolume()
{
}

HdDirtyBits HdCyclesVolume::GetInitialDirtyBitsMask() const
{
  HdDirtyBits bits = HdCyclesGeometry::GetInitialDirtyBitsMask();
  bits |= HdChangeTracker::DirtyVolumeField;
  return bits;
}

void HdCyclesVolume::Populate(HdSceneDelegate *sceneDelegate, HdDirtyBits dirtyBits, bool &rebuild)
{
  Scene *const scene = (Scene *)_geom->get_owner();

  if (dirtyBits & HdChangeTracker::DirtyVolumeField) {
    for (const HdVolumeFieldDescriptor &field :
         sceneDelegate->GetVolumeFieldDescriptors(GetId())) {
      if (const auto openvdbAsset = static_cast<HdCyclesField *>(
              sceneDelegate->GetRenderIndex().GetBprim(_tokens->openvdbAsset, field.fieldId))) {
        const ustring name(field.fieldName.GetString());

        AttributeStandard std = ATTR_STD_NONE;
        if (name == Attribute::standard_name(ATTR_STD_VOLUME_DENSITY)) {
          std = ATTR_STD_VOLUME_DENSITY;
        }
        else if (name == Attribute::standard_name(ATTR_STD_VOLUME_COLOR)) {
          std = ATTR_STD_VOLUME_COLOR;
        }
        else if (name == Attribute::standard_name(ATTR_STD_VOLUME_FLAME)) {
          std = ATTR_STD_VOLUME_FLAME;
        }
        else if (name == Attribute::standard_name(ATTR_STD_VOLUME_HEAT)) {
          std = ATTR_STD_VOLUME_HEAT;
        }
        else if (name == Attribute::standard_name(ATTR_STD_VOLUME_TEMPERATURE)) {
          std = ATTR_STD_VOLUME_TEMPERATURE;
        }
        else if (name == Attribute::standard_name(ATTR_STD_VOLUME_VELOCITY)) {
          std = ATTR_STD_VOLUME_VELOCITY;
        }

        // Skip attributes that are not needed
        if ((std != ATTR_STD_NONE && _geom->need_attribute(scene, std)) ||
            _geom->need_attribute(scene, name)) {
          Attribute *const attr = (std != ATTR_STD_NONE) ?
                                      _geom->attributes.add(std) :
                                      _geom->attributes.add(
                                          name, TypeDesc::TypeFloat, ATTR_ELEMENT_VOXEL);
          attr->data_voxel() = openvdbAsset->GetImageHandle();
        }
      }
    }

    rebuild = true;
  }
}

HDCYCLES_NAMESPACE_CLOSE_SCOPE