diff options
Diffstat (limited to 'intern/cycles/hydra/attribute.cpp')
-rw-r--r-- | intern/cycles/hydra/attribute.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/intern/cycles/hydra/attribute.cpp b/intern/cycles/hydra/attribute.cpp new file mode 100644 index 00000000000..f22665345e6 --- /dev/null +++ b/intern/cycles/hydra/attribute.cpp @@ -0,0 +1,71 @@ +/* SPDX-License-Identifier: Apache-2.0 + * Copyright 2022 NVIDIA Corporation + * Copyright 2022 Blender Foundation */ + +#include "hydra/attribute.h" +#include "scene/attribute.h" +#include "scene/geometry.h" +#include "scene/scene.h" + +#include <pxr/base/gf/vec2f.h> +#include <pxr/base/gf/vec3f.h> +#include <pxr/base/gf/vec4f.h> +#include <pxr/base/vt/array.h> +#include <pxr/imaging/hd/tokens.h> + +HDCYCLES_NAMESPACE_OPEN_SCOPE + +void ApplyPrimvars(AttributeSet &attributes, + const ustring &name, + VtValue value, + AttributeElement elem, + AttributeStandard std) +{ + const void *data = HdGetValueData(value); + size_t size = value.GetArraySize(); + + const HdType valueType = HdGetValueTupleType(value).type; + + TypeDesc attrType = CCL_NS::TypeUnknown; + switch (valueType) { + case HdTypeFloat: + attrType = CCL_NS::TypeFloat; + size *= sizeof(float); + break; + case HdTypeFloatVec2: + attrType = CCL_NS::TypeFloat2; + size *= sizeof(float2); + static_assert(sizeof(GfVec2f) == sizeof(float2)); + break; + case HdTypeFloatVec3: { + attrType = CCL_NS::TypeVector; + size *= sizeof(float3); + // The Cycles "float3" data type is padded to "float4", so need to convert the array + const auto &valueData = value.Get<VtVec3fArray>(); + VtArray<float3> valueConverted; + valueConverted.reserve(valueData.size()); + for (const GfVec3f &vec : valueData) { + valueConverted.push_back(make_float3(vec[0], vec[1], vec[2])); + } + data = valueConverted.data(); + value = std::move(valueConverted); + break; + } + case HdTypeFloatVec4: + attrType = CCL_NS::TypeFloat4; + size *= sizeof(float4); + static_assert(sizeof(GfVec4f) == sizeof(float4)); + break; + default: + TF_WARN("Unsupported attribute type %d", static_cast<int>(valueType)); + return; + } + + Attribute *const attr = attributes.add(name, attrType, elem); + attr->std = std; + + assert(size == attr->buffer.size()); + std::memcpy(attr->data(), data, size); +} + +HDCYCLES_NAMESPACE_CLOSE_SCOPE |